Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Tool Command Language</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Tool_Command_Language"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Tool_Command_Language rootpage-Tool_Command_Language skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Tool Command Language</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr">

<p class="mw-empty-elt">
</p>
<table class="infobox_v2 infobox infobox--frwiki noarchive">
<tbody><tr>
<td colspan="2" class="entete informatique" style="background-color:#C3B15F;color:black;"><span style="color: #fff;">Tcl</span><style data-mw-deduplicate="TemplateStyles:r228712691">
/* start https://fr.wikipedia.org/ */


.mw-parser-output .entete.informatique{background-image:url("./_mw_/Picto.nfo.png")}


/* end https://fr.wikipedia.org/ */
</style>
</td></tr>
<tr><td colspan="3" style="text-align:center; line-height: 1.5em;"> </td></tr>
<tr>
<td colspan="3" style="text-align:center; line-height: 1.5em;"> </td></tr>
<tr>
<td colspan="2"><hr style="height:2px; color:inherit; background-color:#C3B15F;"></td></tr>
<tr>
<th scope="row">Date de première version
</th>
<td><a href="1988" title="1988">1988</a>
</td>
</tr>
<tr>

<th scope="row"><a href="Paradigme_(programmation)" title="Paradigme (programmation)">Paradigmes</a>
</th>
<td><a href="Programmation_imp%C3%A9rative" title="Programmation impérative">Impératif</a>, <a href="Programmation_fonctionnelle" title="Programmation fonctionnelle">fonctionnel</a>, <a href="Programmation_orient%C3%A9e_objet" title="Programmation orientée objet">objet</a>, <a href="Programmation_%C3%A9v%C3%A9nementielle" title="Programmation événementielle">événementiel</a>
</td>
</tr>
<tr>
<th scope="row">Auteur
</th>
<td><a href="John_Ousterhout" title="John Ousterhout">John Ousterhout</a>
</td>
</tr>
<tr>


<th scope="row">Développeurs
</th>
<td><a rel="nofollow" class="external text" href="http://www.tcl.tk/community/coreteam/">Tcl Core Team et al.</a>
</td>
</tr>
<tr>
<th scope="row"><a href="Version_d'un_logiciel" title="Version d'un logiciel">Dernière version</a>
</th>
<td><span class="wd_p348">9.0.2 (<time class="nowrap date-lien" datetime="2025-07-02" data-sort-value="2025-07-02"><a href="2_juillet" title="2 juillet">2</a> <a href="Juillet_2025" title="Juillet 2025">juillet</a> <a href="2025" title="2025">2025</a></time>)<sup id="cite_ref-wikidata-812bc74b3335ac4dc35825393705ee31bb67cc23_1-1" class="reference"><a href="#cite_note-wikidata-812bc74b3335ac4dc35825393705ee31bb67cc23-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup></span>
</td>
</tr>
<tr>
<th scope="row"><a href="Version_d'un_logiciel" title="Version d'un logiciel">Version en développement</a>
</th>
<td><span class="wd_p348">7.4b1 (<time class="nowrap date-lien" datetime="1994-12-23" data-sort-value="1994-12-23"><a href="23_d%C3%A9cembre" title="23 décembre">23</a> <a href="D%C3%A9cembre_1994" title="Décembre 1994">décembre</a> <a href="1994" title="1994">1994</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-0" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>7.5a2 (<time class="nowrap date-lien" datetime="1995-10-06" data-sort-value="1995-10-06"><a href="6_octobre" title="6 octobre">6</a> <a href="Octobre_1995" title="Octobre 1995">octobre</a> <a href="1995" title="1995">1995</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-1" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>7.5b1 (<time class="nowrap date-lien" datetime="1996-02-01" data-sort-value="1996-02-01"><a href="1er_f%C3%A9vrier" title="1er février">1<sup>er</sup></a> <a href="F%C3%A9vrier_1996" title="Février 1996">février</a> <a href="1996" title="1996">1996</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-2" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>7.5b2 (<time class="nowrap date-lien" datetime="1996-02-23" data-sort-value="1996-02-23"><a href="23_f%C3%A9vrier" title="23 février">23</a> <a href="F%C3%A9vrier_1996" title="Février 1996">février</a> <a href="1996" title="1996">1996</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-3" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>7.5b3 (<time class="nowrap date-lien" datetime="1996-03-08" data-sort-value="1996-03-08"><a href="8_mars" title="8 mars">8</a> <a href="Mars_1996" title="Mars 1996">mars</a> <a href="1996" title="1996">1996</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-4" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>7.6b1 (<time class="nowrap date-lien" datetime="1996-08-30" data-sort-value="1996-08-30"><a href="30_ao%C3%BBt" title="30 août">30</a> <a href="Ao%C3%BBt_1996" title="Août 1996">août</a> <a href="1996" title="1996">1996</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-5" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.0a1 (<time class="nowrap date-lien" datetime="1996-12-20" data-sort-value="1996-12-20"><a href="20_d%C3%A9cembre" title="20 décembre">20</a> <a href="D%C3%A9cembre_1996" title="Décembre 1996">décembre</a> <a href="1996" title="1996">1996</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-6" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.0a2 (<time class="nowrap date-lien" datetime="1997-01-24" data-sort-value="1997-01-24"><a href="24_janvier" title="24 janvier">24</a> <a href="Janvier_1997" title="Janvier 1997">janvier</a> <a href="1997" title="1997">1997</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-7" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.0b1 (<time class="nowrap date-lien" datetime="1997-05-27" data-sort-value="1997-05-27"><a href="27_mai" title="27 mai">27</a> <a href="Mai_1997" title="Mai 1997">mai</a> <a href="1997" title="1997">1997</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-8" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.0b2 (<time class="nowrap date-lien" datetime="1997-06-30" data-sort-value="1997-06-30"><a href="30_juin" title="30 juin">30</a> <a href="Juin_1997" title="Juin 1997">juin</a> <a href="1997" title="1997">1997</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-9" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.1a1 (<time class="nowrap date-lien" datetime="1998-01-22" data-sort-value="1998-01-22"><a href="22_janvier" title="22 janvier">22</a> <a href="Janvier_1998" title="Janvier 1998">janvier</a> <a href="1998" title="1998">1998</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-10" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.1a2 (<time class="nowrap date-lien" datetime="1998-02-23" data-sort-value="1998-02-23"><a href="23_f%C3%A9vrier" title="23 février">23</a> <a href="F%C3%A9vrier_1998" title="Février 1998">février</a> <a href="1998" title="1998">1998</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-11" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.1b1 (<time class="nowrap date-lien" datetime="1998-12-10" data-sort-value="1998-12-10"><a href="10_d%C3%A9cembre" title="10 décembre">10</a> <a href="D%C3%A9cembre_1998" title="Décembre 1998">décembre</a> <a href="1998" title="1998">1998</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-12" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.1b2 (<time class="nowrap date-lien" datetime="1999-03-16" data-sort-value="1999-03-16"><a href="16_mars" title="16 mars">16</a> <a href="Mars_1999" title="Mars 1999">mars</a> <a href="1999" title="1999">1999</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-13" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.1b3 (<time class="nowrap date-lien" datetime="1999-04-06" data-sort-value="1999-04-06"><a href="6_avril" title="6 avril">6</a> <a href="Avril_1999" title="Avril 1999">avril</a> <a href="1999" title="1999">1999</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-14" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.2b1 (<time class="nowrap date-lien" datetime="1999-07-14" data-sort-value="1999-07-14"><a href="14_juillet" title="14 juillet">14</a> <a href="Juillet_1999" title="Juillet 1999">juillet</a> <a href="1999" title="1999">1999</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-15" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.2b2 (<time class="nowrap date-lien" datetime="1999-08-05" data-sort-value="1999-08-05"><a href="5_ao%C3%BBt" title="5 août">5</a> <a href="Ao%C3%BBt_1999" title="Août 1999">août</a> <a href="1999" title="1999">1999</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-16" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.2b3 (<time class="nowrap date-lien" datetime="1999-08-11" data-sort-value="1999-08-11"><a href="11_ao%C3%BBt" title="11 août">11</a> <a href="Ao%C3%BBt_1999" title="Août 1999">août</a> <a href="1999" title="1999">1999</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-17" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.3b1 (<time class="nowrap date-lien" datetime="1999-12-22" data-sort-value="1999-12-22"><a href="22_d%C3%A9cembre" title="22 décembre">22</a> <a href="D%C3%A9cembre_1999" title="Décembre 1999">décembre</a> <a href="1999" title="1999">1999</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-18" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.3b2 (<time class="nowrap date-lien" datetime="2000-01-13" data-sort-value="2000-01-13"><a href="13_janvier" title="13 janvier">13</a> <a href="Janvier_2000" title="Janvier 2000">janvier</a> <a href="2000" title="2000">2000</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-19" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.4a1 (<time class="nowrap date-lien" datetime="2000-06-06" data-sort-value="2000-06-06"><a href="6_juin" title="6 juin">6</a> <a href="Juin_2000" title="Juin 2000">juin</a> <a href="2000" title="2000">2000</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-20" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.4a2 (<time class="nowrap date-lien" datetime="2000-11-03" data-sort-value="2000-11-03"><a href="3_novembre" title="3 novembre">3</a> <a href="Novembre_2000" title="Novembre 2000">novembre</a> <a href="2000" title="2000">2000</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-21" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.4a3 (<time class="nowrap date-lien" datetime="2001-08-06" data-sort-value="2001-08-06"><a href="6_ao%C3%BBt" title="6 août">6</a> <a href="Ao%C3%BBt_2001" title="Août 2001">août</a> <a href="2001" title="2001">2001</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-22" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.4a4 (<time class="nowrap date-lien" datetime="2002-03-05" data-sort-value="2002-03-05"><a href="5_mars" title="5 mars">5</a> <a href="Mars_2002" title="Mars 2002">mars</a> <a href="2002" title="2002">2002</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-23" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.4b1 (<time class="nowrap date-lien" datetime="2002-07-05" data-sort-value="2002-07-05"><a href="5_juillet" title="5 juillet">5</a> <a href="Juillet_2002" title="Juillet 2002">juillet</a> <a href="2002" title="2002">2002</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-24" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.4b2 (<time class="nowrap date-lien" datetime="2002-08-09" data-sort-value="2002-08-09"><a href="9_ao%C3%BBt" title="9 août">9</a> <a href="Ao%C3%BBt_2002" title="Août 2002">août</a> <a href="2002" title="2002">2002</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-25" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.5a1 (<time class="nowrap date-lien" datetime="2004-03-03" data-sort-value="2004-03-03"><a href="3_mars" title="3 mars">3</a> <a href="Mars_2004" title="Mars 2004">mars</a> <a href="2004" title="2004">2004</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-26" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.5a2 (<time class="nowrap date-lien" datetime="2004-12-07" data-sort-value="2004-12-07"><a href="7_d%C3%A9cembre" title="7 décembre">7</a> <a href="D%C3%A9cembre_2004" title="Décembre 2004">décembre</a> <a href="2004" title="2004">2004</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-27" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.5a3 (<time class="nowrap date-lien" datetime="2005-06-04" data-sort-value="2005-06-04"><a href="4_juin" title="4 juin">4</a> <a href="Juin_2005" title="Juin 2005">juin</a> <a href="2005" title="2005">2005</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-28" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.5a4 (<time class="nowrap date-lien" datetime="2006-04-27" data-sort-value="2006-04-27"><a href="27_avril" title="27 avril">27</a> <a href="Avril_2006" title="Avril 2006">avril</a> <a href="2006" title="2006">2006</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-29" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.5a5 (<time class="nowrap date-lien" datetime="2006-10-20" data-sort-value="2006-10-20"><a href="20_octobre" title="20 octobre">20</a> <a href="Octobre_2006" title="Octobre 2006">octobre</a> <a href="2006" title="2006">2006</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-30" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.5a6 (<time class="nowrap date-lien" datetime="2007-04-25" data-sort-value="2007-04-25"><a href="25_avril" title="25 avril">25</a> <a href="Avril_2007" title="Avril 2007">avril</a> <a href="2007" title="2007">2007</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-31" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.5b1 (<time class="nowrap date-lien" datetime="2007-09-26" data-sort-value="2007-09-26"><a href="26_septembre" title="26 septembre">26</a> <a href="Septembre_2007" title="Septembre 2007">septembre</a> <a href="2007" title="2007">2007</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-32" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.5b2 (<time class="nowrap date-lien" datetime="2007-10-26" data-sort-value="2007-10-26"><a href="26_octobre" title="26 octobre">26</a> <a href="Octobre_2007" title="Octobre 2007">octobre</a> <a href="2007" title="2007">2007</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-33" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.5b3 (<time class="nowrap date-lien" datetime="2007-11-19" data-sort-value="2007-11-19"><a href="19_novembre" title="19 novembre">19</a> <a href="Novembre_2007" title="Novembre 2007">novembre</a> <a href="2007" title="2007">2007</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-34" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.6a1 (<time class="nowrap date-lien" datetime="2008-06-25" data-sort-value="2008-06-25"><a href="25_juin" title="25 juin">25</a> <a href="Juin_2008" title="Juin 2008">juin</a> <a href="2008" title="2008">2008</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-35" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.6a2 (<time class="nowrap date-lien" datetime="2008-08-25" data-sort-value="2008-08-25"><a href="25_ao%C3%BBt" title="25 août">25</a> <a href="Ao%C3%BBt_2008" title="Août 2008">août</a> <a href="2008" title="2008">2008</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-36" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.6a3 (<time class="nowrap date-lien" datetime="2008-10-10" data-sort-value="2008-10-10"><a href="10_octobre" title="10 octobre">10</a> <a href="Octobre_2008" title="Octobre 2008">octobre</a> <a href="2008" title="2008">2008</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-37" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.6b1 (<time class="nowrap date-lien" datetime="2008-12-19" data-sort-value="2008-12-19"><a href="19_d%C3%A9cembre" title="19 décembre">19</a> <a href="D%C3%A9cembre_2008" title="Décembre 2008">décembre</a> <a href="2008" title="2008">2008</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-38" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.6b2 (<time class="nowrap date-lien" datetime="2011-08-08" data-sort-value="2011-08-08"><a href="8_ao%C3%BBt" title="8 août">8</a> <a href="Ao%C3%BBt_2011" title="Août 2011">août</a> <a href="2011" title="2011">2011</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-39" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.6b3 (<time class="nowrap date-lien" datetime="2012-09-18" data-sort-value="2012-09-18"><a href="18_septembre" title="18 septembre">18</a> <a href="Septembre_2012" title="Septembre 2012">septembre</a> <a href="2012" title="2012">2012</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-40" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.7a1 (<time class="nowrap date-lien" datetime="2017-09-08" data-sort-value="2017-09-08"><a href="8_septembre" title="8 septembre">8</a> <a href="Septembre_2017" title="Septembre 2017">septembre</a> <a href="2017" title="2017">2017</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-41" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>7.0 Beta 1 (<time class="nowrap date-lien" datetime="1993-07-09" data-sort-value="1993-07-09"><a href="9_juillet" title="9 juillet">9</a> <a href="Juillet_1993" title="Juillet 1993">juillet</a> <a href="1993" title="1993">1993</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-42" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>7.0 Beta 2 (<time class="nowrap date-lien" datetime="1993-07-21" data-sort-value="1993-07-21"><a href="21_juillet" title="21 juillet">21</a> <a href="Juillet_1993" title="Juillet 1993">juillet</a> <a href="1993" title="1993">1993</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-43" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>7.0 Beta 3 (<time class="nowrap date-lien" datetime="1993-08-28" data-sort-value="1993-08-28"><a href="28_ao%C3%BBt" title="28 août">28</a> <a href="Ao%C3%BBt_1993" title="Août 1993">août</a> <a href="1993" title="1993">1993</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-44" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>7.4b2 (<time class="nowrap date-lien" datetime="1995-01-12" data-sort-value="1995-01-12"><a href="12_janvier" title="12 janvier">12</a> <a href="Janvier_1995" title="Janvier 1995">janvier</a> <a href="1995" title="1995">1995</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-45" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>7.4b3 (<time class="nowrap date-lien" datetime="1995-03-24" data-sort-value="1995-03-24"><a href="24_mars" title="24 mars">24</a> <a href="Mars_1995" title="Mars 1995">mars</a> <a href="1995" title="1995">1995</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-46" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>7.4b4 (<time class="nowrap date-lien" datetime="1995-06-16" data-sort-value="1995-06-16"><a href="16_juin" title="16 juin">16</a> <a href="Juin_1995" title="Juin 1995">juin</a> <a href="1995" title="1995">1995</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-47" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>7.5a1 (<time class="nowrap date-lien" datetime="1995-09-15" data-sort-value="1995-09-15"><a href="15_septembre" title="15 septembre">15</a> <a href="Septembre_1995" title="Septembre 1995">septembre</a> <a href="1995" title="1995">1995</a></time>)<sup id="cite_ref-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6_2-48" class="reference"><a href="#cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><br>8.7a1 (<time class="nowrap date-lien" datetime="2017-09-08" data-sort-value="2017-09-08"><a href="8_septembre" title="8 septembre">8</a> <a href="Septembre_2017" title="Septembre 2017">septembre</a> <a href="2017" title="2017">2017</a></time>)<sup id="cite_ref-wikidata-9ed4f6b82a6f7f1e060fa15081745f84e1d20ef8_3-0" class="reference"><a href="#cite_note-wikidata-9ed4f6b82a6f7f1e060fa15081745f84e1d20ef8-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup><br>8.7a5 (<time class="nowrap date-lien" datetime="2021-06-18" data-sort-value="2021-06-18"><a href="18_juin" title="18 juin">18</a> <a href="Juin_2021" title="Juin 2021">juin</a> <a href="2021" title="2021">2021</a></time>)<sup id="cite_ref-wikidata-52a9a089d4ebe7c06eeeb34cc72436e39c08e2ad_4-0" class="reference"><a href="#cite_note-wikidata-52a9a089d4ebe7c06eeeb34cc72436e39c08e2ad-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup><br>9.0.0RC0 (<time class="nowrap date-lien" datetime="2024-09-10" data-sort-value="2024-09-10"><a href="10_septembre" title="10 septembre">10</a> <a href="Septembre_2024" title="Septembre 2024">septembre</a> <a href="2024" title="2024">2024</a></time>)<sup id="cite_ref-wikidata-8b22722242fe9f9ff7888041da53127f31ba671f_5-0" class="reference"><a href="#cite_note-wikidata-8b22722242fe9f9ff7888041da53127f31ba671f-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup></span>
</td>
</tr>
<tr>
<th scope="row">Typage
</th>
<td><a href="Typage_dynamique" title="Typage dynamique">dynamique</a> (tout est <a href="Cha%C3%AEne_de_caract%C3%A8res" title="Chaîne de caractères">chaîne de caractères</a>)
</td>
</tr>
<tr>


<th scope="row">Influencé par
</th>
<td><a href="C_(langage)" title="C (langage)">C</a>, <a href="Lisp_(langage)" class="mw-redirect" title="Lisp (langage)">Lisp</a>, <a href="Shell_(informatique)" class="mw-redirect" title="Shell (informatique)">Shell</a>, <a href="Awk" title="Awk">Awk</a>, SCL
</td>
</tr>
<tr>
<th scope="row">A influencé
</th>
<td><a href="Python_(langage)" title="Python (langage)">Python</a>, <a href="PowerShell" class="mw-redirect" title="PowerShell">PowerShell</a>, <a href="Tea_(langage_de_programmation)" title="Tea (langage de programmation)">Tea</a>
</td>
</tr>
<tr>
<th scope="row">Implémentations
</th>
<td>TCL, Jacl, Jim, Hecl
</td>
</tr>
<tr>

<th scope="row"><a href="Syst%C3%A8me_d'exploitation" title="Système d'exploitation">Système d'exploitation</a>
</th>
<td><a href="Logiciel_multiplate-forme" class="mw-redirect" title="Logiciel multiplate-forme">Multi-plateforme</a>
</td>
</tr>
<tr>

<th scope="row"><a href="Licence_de_logiciel" title="Licence de logiciel">Licence</a>
</th>
<td><a href="Licence_BSD" title="Licence BSD">BSD</a>
</td>
</tr>
<tr>
<th scope="row"><a href="Site_web" title="Site web">Site web</a>
</th>
<td><a rel="nofollow" class="external text" href="http://www.tcl.tk/">http://www.tcl.tk/</a>
</td>
</tr>
<tr>
<th scope="row"><a href="Extension_de_nom_de_fichier" title="Extension de nom de fichier">Extension de fichier</a>
</th>
<td>.tcl
</td>
</tr>
<tr>

</tr>
</tbody></table>
<p><span class="lang-en" lang="en"><b>Tool Command Language</b></span> (abréviation&nbsp;: Tcl) est un <a href="Langage_de_script" title="Langage de script">langage de script</a> initialement conçu en <a href="1988" title="1988">1988</a> par <a href="John_Ousterhout" title="John Ousterhout">John Ousterhout</a> et son équipe à l'<a href="Universit%C3%A9_de_Californie_%C3%A0_Berkeley" title="Université de Californie à Berkeley">université de Californie à Berkeley</a>. Il s'inspire principalement des langages <a href="C_(langage)" title="C (langage)">C</a>, <a href="Lisp_(langage)" class="mw-redirect" title="Lisp (langage)">Lisp</a>, <a href="Bourne_shell" title="Bourne shell">sh</a> et <a href="Awk" title="Awk">awk</a>. Ce langage à <a href="Typage_dynamique" title="Typage dynamique">typage dynamique</a> est <a href="Logiciel_multiplateforme" title="Logiciel multiplateforme">multiplateforme</a>, extensible, facile à apprendre et repose sur 12 <a href="Syntaxe" title="Syntaxe">règles syntaxiques</a>. Tcl s'interface très aisément avec le langage <a href="C_(langage)" title="C (langage)">C</a>, ce qui lui permet de servir par exemple d'<a href="Interpr%C3%A8te_(informatique)" title="Interprète (informatique)">interprète</a> embarqué dans des <a href="Application_(informatique)" title="Application (informatique)">applications</a>.
</p><p>En 1990, John Ousterhout développe une extension pour Tcl appelée <a href="Tk_(informatique)" title="Tk (informatique)">Tk</a> qui est une <a href="Biblioth%C3%A8que_logicielle" title="Bibliothèque logicielle">bibliothèque</a> pour créer des <a href="Interface_graphique" title="Interface graphique">interfaces graphiques</a> portables. Par la suite, le développement de Tk se découpla suffisamment de celui de Tcl pour être utilisé avec d'autres langages. Cependant la combinaison de Tcl et <a href="Tk_(informatique)" title="Tk (informatique)">Tk</a> reste connue comme langage sous le nom de Tcl-Tk ou Tcl/Tk.
</p><p>Tcl-Tk fait partie des langages de programmation ayant la propriété d'<a href="Homoiconicit%C3%A9" title="Homoiconicité">homoiconicité</a>, tout comme <a href="Lisp_(langage)" class="mw-redirect" title="Lisp (langage)">Lisp</a>.
Nombre d'informaticiens prononcent «&nbsp;<span class="lang-en" lang="en"><i>tickle</i></span>&nbsp;» en parlant de <i>Tcl</i>, ce qui signifie chatouiller en anglais. <i>Tk</i> est prononcé «&nbsp;<span class="lang-en" lang="en"><i>ticket</i></span>&nbsp;».
</p>

<div class="mw-heading mw-heading2"><h2 id="Caractéristiques"><span id="Caract.C3.A9ristiques"></span>Caractéristiques</h2></div>
<p>Réputé <span class="need_ref" title="Une source est souhaitée pour ce passage." style="cursor:help;">économe en mémoire vive</span><sup class="need_ref_tag" style="padding-left:2px;">[<abbr class="abbr" title="référence">réf.</abbr>&nbsp;souhaitée]</sup>, Tcl est un <a href="Langage_interpr%C3%A9t%C3%A9" class="mw-redirect" title="Langage interprété">langage interprété</a> multiplateforme.
</p><p>L’un des mots d’ordre du langage est résumé sous la forme de <i>tout est une <a href="Cha%C3%AEne_de_caract%C3%A8res" title="Chaîne de caractères">chaîne de caractères</a></i> (traduction littérale de <span class="lang-en" lang="en"><i>everything is a string</i></span>)&nbsp;: même le code définissant une procédure peut être manipulé comme une chaîne.
</p><p>Par ailleurs, tout au sein du langage est une commande&nbsp;: même les instructions comme <i>if</i> ou <i>while</i> sont des commandes, et ne relèvent aucunement de la syntaxe du langage. Toutes les commandes, (y compris l'affectation de variables) peuvent être <a href="Surcharge_des_op%C3%A9rateurs" class="mw-redirect" title="Surcharge des opérateurs">surchargées</a>.
</p><p>Les expressions mathématiques sont évaluées par une commande spéciale, avec une syntaxe inspirée du <a href="C_(langage)" title="C (langage)">C</a>.
</p><p>Les listes imbriquées sont l'un des types de base du langage, et permettent une <a href="Programmation_fonctionnelle" title="Programmation fonctionnelle">programmation fonctionnelle</a> très concise. La syntaxe devient alors proche de la <a href="Notations_infix%C3%A9e%2C_pr%C3%A9fix%C3%A9e%2C_polonaise_et_postfix%C3%A9e" title="Notations infixée, préfixée, polonaise et postfixée">notation préfixée</a>.
</p><p>L'<a href="Introspection_(informatique)" class="mw-redirect" title="Introspection (informatique)">introspection</a> de l'interprète permet d'accéder à toute la <a href="Pile_d'ex%C3%A9cution" title="Pile d'exécution">pile d'exécution</a>, et d'exécuter des commandes à un niveau supérieur (dans la pile).
</p><p>Il est possible de définir des <a href="D%C3%A9clencheur" title="Déclencheur">actions à déclencher</a> sur la lecture ou écriture d'une variable, ainsi que sur l'appel d'une procédure.
</p><p>Le langage permet également de définir de nouvelles <a href="Structure_de_contr%C3%B4le" title="Structure de contrôle">structures de contrôle</a> (<i>do .. until</i> par exemple) en quelques lignes.
</p><p>Les chaînes de caractères respectent la norme <a href="Unicode" title="Unicode">Unicode</a>, et des commandes permettent de convertir des chaînes entre différents <a href="Codage_des_caract%C3%A8res" title="Codage des caractères">codages</a>.
</p><p>Les <i><a href="Berkeley_sockets" title="Berkeley sockets">sockets</a></i> multiplateformes sont gérés, aussi bien côté client que côté serveur.
</p><p>Tcl permet la recherche et substitution d'<a href="Expression_rationnelle" class="mw-redirect" title="Expression rationnelle">expressions rationnelles</a>.
</p><p>L’intégration de code natif C, <a href="C%2B%2B" title="C++">C++</a> et <a href="Java_(langage)" title="Java (langage)">Java</a> est possible.
</p><p>Depuis la version de 8.6, Tcl dispose de la <a href="Programmation_orient%C3%A9e_objet" title="Programmation orientée objet">programmation orientée objet</a> en natif.
</p>
<div class="mw-heading mw-heading2"><h2 id="Description">Description</h2></div>
<p>Le langage a également des aspects communs avec <a href="Lisp_(langage)" class="mw-redirect" title="Lisp (langage)">Lisp</a> et <a href="Forth_(langage)" title="Forth (langage)">Forth</a>. Il est présenté comme permettant de développer très rapidement des <a href="Logiciel" title="Logiciel">logiciels</a> de petite ou moyenne taille. De plus, il est possible d'intégrer différents autres logiciels avec une <a href="Interactions_homme-machine" class="mw-redirect" title="Interactions homme-machine">IHM</a> en Tcl/Tk.
</p><p>Tcl est surtout connu pour son extension graphique <a href="Tk_(informatique)" title="Tk (informatique)">Tk</a>. <b>Tcl/Tk</b> permet de concevoir des applications fenêtrées indépendamment de la plate-forme (<a href="UNIX" class="mw-redirect" title="UNIX">UNIX</a> / <a href="Mac_OS" class="mw-redirect" title="Mac OS">Mac OS</a> / <a href="Microsoft_Windows" title="Microsoft Windows">Windows</a>) à la manière de Swing pour <a href="Java_(langage)" title="Java (langage)">langage Java</a>.
</p><p>Tcl étant un langage interprété, le développement d'un <a href="Programme_informatique" title="Programme informatique">programme</a> peut s'effectuer par touches successives. Cette <a href="M%C3%A9thode_de_travail" title="Méthode de travail">méthode de travail</a> correspond à un <a href="Mod%C3%A8le_en_cascade" title="Modèle en cascade">cycle de développement en cascade</a>.
</p><p>Tcl facilite l'accès aux fonctions de son interprète, ce qui contribue à la puissance du langage et le place à mi-chemin entre un langage fonctionnel comme <a href="Lisp_(langage)" class="mw-redirect" title="Lisp (langage)">Lisp</a> et un langage impératif comme <a href="BASIC" class="mw-redirect" title="BASIC">BASIC</a>.
</p><p>Tcl est souvent intégré ou embarqué dans des applications. L'une de ses forces est la réalisation possible d'une suite de tests unitaires pour une application donnée. La réalisation aisée de tests de validation rend le développement incrémental très facile (à la manière de <a href="Forth_(langage)" title="Forth (langage)">Forth</a>).
</p>
<div class="mw-heading mw-heading2"><h2 id="Syntaxe_et_sémantique"><span id="Syntaxe_et_s.C3.A9mantique"></span>Syntaxe et sémantique</h2></div>
<p>La syntaxe suit le modèle d'un <a href="Shell_(informatique)" class="mw-redirect" title="Shell (informatique)">shell</a>, avec quelques simplifications par rapport à des langages comme perl ou ksh. Un script de Tcl contient une ou plusieurs commandes. Une commande se compose de un ou plusieurs mots, qui sont séparés par des espaces.
</p>
<pre>mot0 mot1 mot2 mot3 ... motN
</pre>
<ul><li>Les "" servent à grouper plusieurs mots, et ils seront considérés comme un seul mot (s'il y a des références parmi ces mots ils seront interprétés (substitués)).</li>
<li>Les {} peuvent jouer le même rôle (sans interprétation des variables) sauf dans certains cas.</li>
<li>Les [] délimitent des appels de fonctions dont on veut connaître le résultat.</li>
<li>Les () indiquent les indices des tableaux <code>T(38)</code> est l'équivalent de <code>T[38]</code> en langage C. Elles peuvent aussi permettre d'ordonner les calculs dans le cas d'expressions mathématiques.</li></ul>
<p>Le premier mot est le nom de la commande. Les mots suivants sont les paramètres.
</p>
<pre>nomDeLaCommande par1 par2 par3 ...parN
</pre>
<p>Au lieu d'un paramètre, on peut mettre entre crochets <code>[ ... ]</code> une autre commande. Celle-ci est interprétée en premier et le résultat devient le paramètre de la commande supérieure. Entre accolades <code>{ ... }</code> on peut mettre comme paramètre une séquence de mots qui n'est pas interprétée, mais utilisée directement.
Les transferts de paramètres se font par valeur. La transmission par référence se fait sans mettre $ devant le nom de la variable, et par la commande <code>upvar</code> dans le corps de la procédure appelée. Les constantes ou chaînes de caractères sont indiquées telles quelles.
Les commentaires s'écrivent après la commande # (qui est une commande comme les autres mais qui ne fait rien).
</p><p>L'affectation se fait par l'instruction <code>set</code>, qui au passage retourne la valeur.
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="o">%</span><span class="w"> </span><span class="k">set</span><span class="w"> </span>a<span class="w"> </span><span class="mi">38</span>
<span class="nv">38</span>
</pre></div>
<p>La valeur d'une variable s'obtient par <code>[set a]</code>.
Remarquons que <code>$a</code> n'est qu'un raccourci d'écriture de <code>[set a]</code>.
</p><p>D'autres exemples de syntaxe&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="o">%</span><span class="w"> </span><span class="k">set</span><span class="w"> </span>s<span class="w"> </span><span class="k">[</span><span class="nv">Somme</span><span class="w"> </span><span class="nv">$a</span><span class="w"> </span><span class="mi">38</span><span class="k">];</span><span class="w"> </span><span class="c"># a, transmis par valeur, ne peut être modifié</span>
<span class="nv">...</span>
<span class="o">%</span><span class="w"> </span><span class="nv">MiseAjour</span><span class="w"> </span>listeA<span class="w"> </span><span class="nv">$x</span><span class="w"> </span><span class="nv">$y</span><span class="k">;</span><span class="w"> </span><span class="c"># listeA, transmis par référence, est modifié par MiseAJour</span>
<span class="nv">...</span>
</pre></div>
<p>La notation usuelle <code>x=f(y)</code> s'écrit en Tcl <code>set x [f $y]</code>.
</p>
<div class="mw-heading mw-heading3"><h3 id="Type_des_variables">Type des variables</h3></div>
<div class="mw-heading mw-heading4"><h4 id="Généralités"><span id="G.C3.A9n.C3.A9ralit.C3.A9s"></span>Généralités</h4></div>
<p>Les variables ne sont pas typées explicitement&nbsp;: elles le sont par la première affectation de contenu qu'on y opère, ou par la commande qui les crée (par ex. l'instruction <code>list</code> pour créer une liste). On peut reconnaître ainsi cinq types de structure dans tcl&nbsp;:
</p>
<ul><li>Les <b>booléens</b>&nbsp;: 0/false/no/n/off (faux) d'une part et 1/true/yes/y/on/ (vrai) ou un nombre différent de 0 d'autre part&nbsp;;</li>
<li>les <b>nombres</b>&nbsp;: 1 0 3.14 1.e-10&nbsp;;</li>
<li>les <b>chaînes de caractères</b>&nbsp;: Bonjour, "Madame De Labas", 32 , {z 3.14}&nbsp;;</li>
<li>les <b>listes</b>&nbsp;: de booléens, nombres, chaînes ou listes (on peut imbriquer les listes)&nbsp;;</li>
<li>les <b>tableaux associatifs</b>&nbsp;: T(clef) M(2,3) qui peuvent contenir les 4 types précédents, même mélangés.</li></ul>
<p>Les quatre premiers types sont dits types scalaires, ils peuvent donc être passés par valeur et retournés à l'appel d'une procédure. Ces types scalaires sont convertis automatiquement dans le type adéquat, par exemple, une chaîne de caractères peut devenir une liste&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="o">%</span><span class="w"> </span><span class="k">set</span><span class="w"> </span>fruits<span class="w"> </span>abricot
<span class="o">%</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="nv">$fruits</span>
<span class="w"> </span><span class="nv">abricot</span>
<span class="o">%</span><span class="w"> </span><span class="k">set</span><span class="w"> </span>fruits<span class="w"> </span><span class="s2">"pomme orange banane"</span>
<span class="o">%</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="k">[</span><span class="nb">lindex</span><span class="w"> </span><span class="nv">$fruits</span><span class="w"> </span>end<span class="k">]</span>
<span class="w"> </span><span class="nv">banane</span>
</pre></div>
<p>Une fonction peut retourner une chaîne ou une liste, mais pas un tableau qui n'est pas une variable scalaire. Ceux-ci peuvent toutefois être transmis par référence. Les dictionnaires (nouveauté de la version 8.5) sont un nouveau type scalaire, pouvant donc être fournis comme paramètre d'une procédure, et même retournés.
</p>
<div class="mw-heading mw-heading4"><h4 id="Booléens"><span id="Bool.C3.A9ens"></span>Booléens</h4></div>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="o">%</span><span class="w"> </span><span class="k">foreach</span><span class="w"> </span>bool<span class="w"> </span><span class="k">[</span><span class="nb">list</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span>false<span class="w"> </span>true<span class="w"> </span>no<span class="w"> </span>yes<span class="w"> </span>n<span class="w"> </span>y<span class="k">]</span><span class="w"> </span><span class="k">{if</span><span class="w"> </span><span class="nv">$bool</span><span class="w"> </span><span class="k">{</span><span class="nb">puts</span><span class="w"> </span><span class="s2">"$bool =&gt; true"</span><span class="k">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">{</span><span class="nb">puts</span><span class="w"> </span><span class="s2">"$bool =&gt; false"</span><span class="k">}}</span>
<span class="nv">0</span><span class="w"> </span><span class="err">=</span><span class="o">&gt;</span><span class="w"> </span>false
<span class="nv">1</span><span class="w"> </span><span class="err">=</span><span class="o">&gt;</span><span class="w"> </span>true
<span class="nv">2</span><span class="w"> </span><span class="err">=</span><span class="o">&gt;</span><span class="w"> </span>true
<span class="nv">false</span><span class="w"> </span><span class="err">=</span><span class="o">&gt;</span><span class="w"> </span>false
<span class="nv">true</span><span class="w"> </span><span class="err">=</span><span class="o">&gt;</span><span class="w"> </span>true
<span class="nv">no</span><span class="w"> </span><span class="err">=</span><span class="o">&gt;</span><span class="w"> </span>false
<span class="nv">yes</span><span class="w"> </span><span class="err">=</span><span class="o">&gt;</span><span class="w"> </span>true
<span class="nv">n</span><span class="w"> </span><span class="err">=</span><span class="o">&gt;</span><span class="w"> </span>false
<span class="nv">y</span><span class="w"> </span><span class="err">=</span><span class="o">&gt;</span><span class="w"> </span>true
</pre></div>
<div class="mw-heading mw-heading4"><h4 id="Nombres">Nombres</h4></div>
<p>Les nombres sont traités comme des chaînes de caractères sauf dans les expressions arithmétiques où ils sont d'abord convertis en binaire.
</p>
<div class="mw-heading mw-heading4"><h4 id="Tableaux_associatifs">Tableaux associatifs</h4></div>
<p>Les tableaux associatifs clé-valeur implémentent un type <a href="Table_de_hachage" title="Table de hachage">table de hachage</a>, sont très rapides et peuvent être très grands. Une clé, indice du tableau, peut être une chaîne de caractères ou une liste, sans limite de taille. On peut, par exemple, utiliser un texte de 10000 lignes comme clé.
</p>
<div class="mw-heading mw-heading3"><h3 id="Structures_de_contrôle"><span id="Structures_de_contr.C3.B4le"></span>Structures de contrôle</h3></div>
<p>Contrairement à ce qui se passe pour d'autres langages, les mots qui servent aux structures de contrôles en Tcl ne sont pas des mots réservés avec une syntaxe spéciale. "for", "if", "while" sont des procédures qui obéissent à la syntaxe Tcl habituelle.
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="k">{</span><span class="w"> </span><span class="nv">uneExpressionLogique</span><span class="w"> </span><span class="k">}</span><span class="w"> </span><span class="k">{</span><span class="w"> </span>
<span class="w"> </span><span class="nv">uneCommande</span>
<span class="w"> </span><span class="nv">uneCommande</span>
<span class="w"> </span><span class="nv">....</span>
<span class="w"> </span><span class="k">}</span>

<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="k">{</span><span class="nv">$x</span><span class="o">&lt;</span><span class="nv">0</span><span class="k">}</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="k">set</span><span class="w"> </span>x<span class="w"> </span><span class="mi">0</span>
<span class="w"> </span><span class="k">}</span><span class="w"> </span><span class="k">elseif</span><span class="w"> </span><span class="k">{</span><span class="w"> </span><span class="nv">$x</span><span class="o">&lt;</span><span class="nv">5</span><span class="w"> </span><span class="k">}</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="k">set</span><span class="w"> </span>x<span class="w"> </span><span class="mi">5</span>
<span class="w"> </span><span class="k">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="k">set</span><span class="w"> </span>x<span class="w"> </span><span class="mi">10</span>
<span class="w"> </span><span class="k">}</span>

<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="k">{set</span><span class="w"> </span>i<span class="w"> </span><span class="mi">0</span><span class="k">}</span><span class="w"> </span><span class="k">{</span><span class="nv">$i</span><span class="o">&lt;</span><span class="nv">10</span><span class="k">}</span><span class="w"> </span><span class="k">{</span><span class="nb">incr</span><span class="w"> </span>i<span class="k">}</span><span class="w"> </span><span class="k">{</span><span class="w"> </span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="nv">$i</span><span class="w"> </span>
<span class="w"> </span><span class="k">}</span>

<span class="w"> </span><span class="k">foreach</span><span class="w"> </span>i<span class="w"> </span><span class="k">[</span><span class="nb">list</span><span class="w"> </span><span class="s2">"youpii"</span><span class="w"> </span><span class="s2">"aujourd'hui"</span><span class="w"> </span><span class="s2">"il fait beau"</span><span class="w"> </span><span class="s2">"bravo&nbsp;!"</span><span class="w"> </span><span class="s2">"bravo&nbsp;!"</span><span class="k">]</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="nv">$i</span>
<span class="w"> </span><span class="k">}</span>

<span class="w"> </span><span class="k">foreach</span><span class="w"> </span>a<span class="w"> </span><span class="nv">$listeA</span><span class="w"> </span>b<span class="w"> </span><span class="nv">$listeB</span><span class="w"> </span>c<span class="w"> </span><span class="nv">$listeC</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"$a $b $c"</span>
<span class="w"> </span><span class="k">}</span>

<span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="k">{</span><span class="nv">x</span><span class="w"> </span>y<span class="k">}</span><span class="w"> </span><span class="k">[</span><span class="nb">list</span><span class="w"> </span>M<span class="w"> </span>Gaston<span class="w"> </span>Mlle<span class="w"> </span>Jeanne<span class="w"> </span>M<span class="w"> </span>Robert<span class="w"> </span>Mme<span class="w"> </span>Raymonde<span class="k">]</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"$x $y"</span>
<span class="w"> </span><span class="k">}</span>

<span class="w"> </span><span class="k">set</span><span class="w"> </span>couleur<span class="w"> </span>bleu
<span class="w"> </span><span class="k">switch</span><span class="w"> </span><span class="nv">$couleur</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="nv">rouge</span><span class="w"> </span><span class="k">{</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"FF0000"</span><span class="w"> </span><span class="k">}</span>
<span class="w"> </span><span class="nv">bleu</span><span class="w"> </span><span class="k">{</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"0000FF"</span><span class="w"> </span><span class="k">}</span>
<span class="w"> </span><span class="nv">vert</span><span class="w"> </span><span class="k">{</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"00FF00"</span><span class="w"> </span><span class="k">}</span>
<span class="w"> </span><span class="nv">blanc</span><span class="w"> </span><span class="k">{</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"FFFFFF"</span><span class="w"> </span><span class="k">}</span>
<span class="w"> </span><span class="nv">noir</span><span class="w"> </span><span class="k">{</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"000000"</span><span class="w"> </span><span class="k">}</span>
<span class="w"> </span><span class="nv">default</span><span class="w"> </span><span class="k">{</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"inconnu"</span><span class="w"> </span><span class="k">}</span>
<span class="w"> </span><span class="k">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Exemples">Exemples</h2></div>
<ul><li>Factorielle (dans le style <a href="Programmation_fonctionnelle" title="Programmation fonctionnelle">programmation fonctionnelle</a>):</li></ul>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="k">proc</span><span class="w"> </span><span class="o">!</span><span class="w"> </span>x<span class="w"> </span><span class="k">{expr</span><span class="w"> </span><span class="k">{</span><span class="nv">$x</span><span class="o">&lt;</span><span class="nv">2</span><span class="o">?</span><span class="w"> </span><span class="mi">1</span><span class="o">:</span><span class="w"> </span><span class="nv">$x</span><span class="o">*</span><span class="k">[</span><span class="o">!</span><span class="w"> </span><span class="k">[</span><span class="nb">incr</span><span class="w"> </span>x<span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="k">]]}}</span>
</pre></div>
<ul><li>Faire la somme d'une liste de nombres</li></ul>
<p>Avec une boucle foreach parcourant la liste&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="k">set</span><span class="w"> </span>nombres<span class="w"> </span><span class="k">{</span><span class="nv">10</span><span class="w"> </span><span class="mi">9</span><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="mi">1</span><span class="k">}</span>
<span class="k">set</span><span class="w"> </span>somme<span class="w"> </span><span class="mi">0</span>
<span class="k">foreach</span><span class="w"> </span>i<span class="w"> </span><span class="nv">$nombres</span><span class="w"> </span><span class="k">{</span><span class="w"> </span>
<span class="w"> </span><span class="k">set</span><span class="w"> </span>somme<span class="w"> </span><span class="k">[expr</span><span class="w"> </span><span class="k">{</span><span class="nv">$somme</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">$i</span><span class="k">}]</span>
<span class="k">}</span>
</pre></div>
<p>Ou en plus compact en utilisant la commande <code>join</code>&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="k">set</span><span class="w"> </span>somme<span class="w"> </span><span class="k">[expr</span><span class="w"> </span><span class="k">[</span><span class="nb">join</span><span class="w"> </span><span class="nv">$nombres</span><span class="w"> </span><span class="o">+</span><span class="k">]]</span>
</pre></div>
<p>Remarquons qu'un opérateur est un caractère comme un autre, il peut donc être stocké dans une variable&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="k">foreach</span><span class="w"> </span>op<span class="w"> </span><span class="k">{</span><span class="o">+</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="nv">-</span><span class="w"> </span><span class="o">/</span><span class="k">}</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="k">set</span><span class="w"> </span>resultat<span class="w"> </span><span class="k">[expr</span><span class="w"> </span><span class="k">[</span><span class="nb">join</span><span class="w"> </span><span class="nv">$nombres</span><span class="w"> </span><span class="nv">$op</span><span class="k">]]</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"Le résultat pour l'opérateur $op vaut $resultat"</span>
<span class="k">}</span>
</pre></div>
<ul><li>Substituer des caractères selon une <a href="Table_de_correspondance" title="Table de correspondance">table de correspondance</a> avec la commande <code>string</code>&nbsp;:</li></ul>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="k">set</span><span class="w"> </span>sequence<span class="w"> </span><span class="s2">"ACGTATTACGGTCCATGAACGAATTGGGATATCGACCATGATGGAATTCTG"</span>
<span class="nb">puts</span><span class="w"> </span><span class="k">[</span><span class="nb">string</span><span class="w"> </span>map<span class="w"> </span><span class="k">{</span><span class="nv">GA</span><span class="w"> </span>R<span class="w"> </span>TC<span class="w"> </span>Y<span class="w"> </span>GT<span class="w"> </span>K<span class="w"> </span>AC<span class="w"> </span>M<span class="w"> </span>GC<span class="w"> </span>S<span class="w"> </span>AT<span class="w"> </span>W<span class="k">}</span><span class="w"> </span><span class="nv">$sequence</span><span class="k">]</span>
</pre></div>
<p>Ensuite donner la fréquence d'apparition des lettres (A, C, T, G) dans la séquence en utilisant un <a href="Tableau_associatif" title="Tableau associatif">tableau associatif</a> (<code>array</code>), la commande <code>split</code> pour isoler chaque motif et la commande d'introspection (<code>info</code>) de l'interprète&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="k">foreach</span><span class="w"> </span>nucleotide<span class="w"> </span><span class="k">[</span><span class="nb">split</span><span class="w"> </span><span class="nv">$sequence</span><span class="w"> </span><span class="s2">""</span><span class="k">]</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="o">!</span><span class="k">[</span><span class="nb">info</span><span class="w"> </span>exists<span class="w"> </span>compte<span class="k">(</span><span class="nv">$nucleotide</span><span class="k">)]</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="k">set</span><span class="w"> </span>compte<span class="k">(</span><span class="nv">$nucleotide</span><span class="k">)</span><span class="w"> </span><span class="mi">1</span>
<span class="w"> </span><span class="k">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">{</span><span class="nb">incr</span><span class="w"> </span>compte<span class="k">(</span><span class="nv">$nucleotide</span><span class="k">)}</span>
<span class="k">}</span>

<span class="k">foreach</span><span class="w"> </span>nucleotide<span class="w"> </span><span class="k">[array</span><span class="w"> </span>names<span class="w"> </span>compte<span class="k">]</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"$nucleotide -&gt; $compte($nucleotide)"</span>
<span class="k">}</span>
</pre></div>
<ul><li>Télécharger une page <a href="Hypertext_Markup_Language" title="Hypertext Markup Language">HTML</a></li></ul>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="nb">package</span><span class="w"> </span>require<span class="w"> </span>http
<span class="nb">puts</span><span class="w"> </span><span class="k">[</span><span class="nb">http</span><span class="o">::</span>data<span class="w"> </span><span class="k">[</span><span class="nb">http</span><span class="o">::</span>geturl<span class="w"> </span>http:<span class="o">//</span>mini.net<span class="o">/</span>tcl<span class="o">/</span><span class="mi">540</span><span class="k">]]</span>
</pre></div>
<ul><li>Donner l'heure par <a href="Synth%C3%A8se_vocale" title="Synthèse vocale">synthèse vocale</a> sous <a href="Android" title="Android">Android</a></li></ul>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="nb">package</span><span class="w"> </span>require<span class="w"> </span>android
<span class="k">set</span><span class="w"> </span>android<span class="w"> </span><span class="k">[</span><span class="nv">android</span><span class="w"> </span>new<span class="k">]</span>
<span class="k">set</span><span class="w"> </span>time<span class="w"> </span><span class="k">[</span><span class="nb">clock</span><span class="w"> </span>format<span class="w"> </span><span class="k">[</span><span class="nb">clock</span><span class="w"> </span>seconds<span class="k">]</span><span class="w"> </span><span class="o">-</span>format<span class="w"> </span><span class="s2">"%I %M %p on %A, %B %e %Y."</span><span class="k">]</span>
<span class="nv">android</span><span class="w"> </span>speak<span class="w"> </span><span class="nv">$time</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Difficultés_et_pièges"><span id="Difficult.C3.A9s_et_pi.C3.A8ges"></span>Difficultés et pièges</h2></div>
<p>Tcl est un langage extrêmement simple, et très puissant. C'est précisément ce qui lui permet d'exécuter du code qu'un compilateur, ou un autre interpréteur refuserait... et de donner un résultat bien différent de celui auquel le développeur s'attendait. Les sites consacrés au développement sous Tcl<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> donnent des conseils aux développeurs débutants pour qu'ils prennent de bonnes habitudes.
</p>
<div class="mw-heading mw-heading3"><h3 id="Noms_de_variable_et_littéraux"><span id="Noms_de_variable_et_litt.C3.A9raux"></span>Noms de variable et littéraux</h3></div>
<p>Se souvenir qu'un nom de variable ne s'écrit pas différemment d'un littéral.
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="o">%</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span>x
<span class="w"> </span><span class="nv">x</span>
<span class="o">%</span><span class="w"> </span><span class="k">set</span><span class="w"> </span>x<span class="w"> </span>a
<span class="w"> </span><span class="nv">a</span>
<span class="o">%</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"x $x"</span>
<span class="w"> </span><span class="nv">x</span><span class="w"> </span>a
<span class="o">%</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="mi">0</span>
<span class="w"> </span><span class="nv">0</span>
<span class="o">%</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">1</span>
<span class="w"> </span><span class="nv">1</span>
<span class="o">%</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="nv">$0</span>
<span class="w"> </span><span class="nv">1</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Substitutions">Substitutions</h3></div>
<p>Les substitutions peuvent donner des résultats surprenants.
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="o">%</span><span class="w"> </span><span class="k">set</span><span class="w"> </span>x<span class="w"> </span><span class="mi">1</span>
<span class="w"> </span><span class="nv">1</span>
<span class="o">%</span><span class="w"> </span><span class="k">set</span><span class="w"> </span>y<span class="w"> </span>x
<span class="w"> </span><span class="nv">x</span>
<span class="o">%</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="nv">$y</span><span class="w"> </span><span class="mi">2</span><span class="k">;</span><span class="w"> </span><span class="c">#Équivaut à set x 2</span>
<span class="w"> </span><span class="nv">2</span>
<span class="o">%</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="nv">$x</span>
<span class="w"> </span><span class="nv">2</span>
</pre></div>
<p>Il n'y a pas de différence entre le code et les données, en ce sens qu'une chaîne de caractères quelconque peut devenir du code. Là encore, attention au jeu des substitutions.
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="k">set</span><span class="w"> </span>i<span class="w"> </span><span class="mi">0</span><span class="k">;</span>
<span class="k">set</span><span class="w"> </span>cond1<span class="w"> </span><span class="s2">"$i&lt;5"</span><span class="k">;</span><span class="w"> </span><span class="c">#! Attention, cond1 est déjà égal à la chaîne "0&lt;5" </span>
<span class="k">set</span><span class="w"> </span>cond2<span class="w"> </span><span class="k">{</span><span class="nv">$i</span><span class="o">&lt;</span><span class="nv">5</span><span class="k">};</span><span class="w"> </span><span class="c">#! Ici, il n'y a pas de substitution, cond2 est égal à "$i&lt;5"</span>
<span class="k">set</span><span class="w"> </span>incre<span class="w"> </span><span class="k">{set</span><span class="w"> </span>i<span class="w"> </span><span class="k">[expr</span><span class="w"> </span><span class="nv">$i</span><span class="o">+</span><span class="mi">1</span><span class="k">];</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="nv">$i</span><span class="k">}</span>
<span class="k">while</span><span class="w"> </span><span class="nv">$cond2</span><span class="w"> </span><span class="nv">$incre</span><span class="k">;</span><span class="w"> </span><span class="c"># Cette boucle s'exécute 5 fois.</span>
<span class="k">set</span><span class="w"> </span>i<span class="w"> </span><span class="mi">0</span><span class="k">;</span>
<span class="k">while</span><span class="w"> </span><span class="nv">$cond1</span><span class="w"> </span><span class="nv">$incre</span><span class="k">;</span><span class="w"> </span><span class="c"># Cette boucle ne se termine jamais.</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Pièges_des_parenthèses,_crochets,_accolades_dans_les_commentaires"><span id="Pi.C3.A8ges_des_parenth.C3.A8ses.2C_crochets.2C_accolades_dans_les_commentaires"></span>Pièges des parenthèses, crochets, accolades dans les commentaires</h3></div>
<p>Nous sommes tentés de mettre des <b>morceaux de code en commentaires. Mais en Tcl, c'est une mauvaise idée.</b>
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="k">set</span><span class="w"> </span>x<span class="w"> </span><span class="mi">1</span><span class="k">;</span>
<span class="c"># Les groupes d'accolade sont prises en compte même dans les commentaires.</span>
<span class="c"># if {$x &gt; 0} { # &lt;----- ligne de code commentée dans laquelle une accolade fermante est manquante. </span>
<span class="k">if</span><span class="w"> </span><span class="k">{</span><span class="nv">$x</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nv">1</span><span class="k">}</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"Dans clause if"</span>
<span class="k">}</span>
<span class="c"># À partir d'ici des erreurs peuvent survenir à cause des groupes d'accolades mal structurés. </span>
<span class="c"># Les causes de ce type d'erreur sont très rarement décelées par un non averti.</span>
</pre></div>
<p>Une solution proposée est&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="k">set</span><span class="w"> </span>x<span class="w"> </span><span class="mi">1</span><span class="k">;</span>
<span class="c"># Les groupes d'accolade sont prises en compte même dans les commentaires.</span>
<span class="c"># if {$x &gt; 0} { }# &lt;----- ligne de code commentée dans laquelle les groupes d'accolades sont entiers. </span>
<span class="k">if</span><span class="w"> </span><span class="k">{</span><span class="nv">$x</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nv">1</span><span class="k">}</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"Dans clause if"</span>
<span class="k">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Déploiement_et_exécution"><span id="D.C3.A9ploiement_et_ex.C3.A9cution"></span>Déploiement et exécution</h2></div>

<div class="mw-heading mw-heading3"><h3 id="Classique">Classique</h3></div>
<p>Sous Linux et les autres plates-formes dérivées d'Unix, l'interprète Tcl-Tk est souvent installé par défaut. Si ce n'est pas le cas, il est nécessaire de compiler le code source à l'aide d'un compilateur C et ensuite de procéder à l'installation. L'exécution d'un code Tcl s'effectue en saisissant à l'invite du shell&nbsp;:
</p>
<pre>tclsh fichier.tcl
</pre>
<p>ou alors en lançant l'interprète via <code>tclsh</code> et ensuite en saisissant à l'invite de l'interprète la ligne suivante&nbsp;:
</p>
<pre>source fichier.tcl
</pre>
<p>Cependant un script Tcl peut s'exécuter directement (un peu comme un <a href="Script_shell" title="Script shell">script shell</a>) en ajoutant la ligne suivante au début du code&nbsp;:
</p>
<pre>#!/usr/bin/env tclsh
</pre>
<p>Sous Windows, il est bien sûr possible de compiler le code source mais la meilleure option demeure quand même l'installation de Tcl-Tk à partir d'une distribution précompilée. Pour exécuter un code Tcl, il suffit de double-cliquer sur celui-ci. À la différence d'Unix, il n'y a pas de console ouverte par défaut sous Windows. Autrement dit, si vous exécutez un code Tcl en imprimant des résultats sur la sortie standard, rien ne s'affichera. Il faut ajouter au préalable la ligne suivante en début de code&nbsp;:
</p>
<pre>console show
</pre>
<p>On peut aussi utiliser l'interprète <code>wish</code> qui gère en plus le toolkit <a href="Tk_(informatique)" title="Tk (informatique)">Tk</a>.
</p>
<div class="mw-heading mw-heading3"><h3 id="Starkit">Starkit</h3></div>
<p>Starkit<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>est l'acronyme de "StandAlone Runtime called Tclkit". C'est un mécanisme qui consiste à regrouper dans un seul fichier tous les éléments qui composent une application Tcl-Tk (sources, images, bibliothèques, extensions, ...) avec la structure dans une sorte de système de fichier virtuel. Le fichier starkit obtenu, portant l'extension <code>.kit</code>, est exécuté par l'intermédiaire de Tclkit, un interprète Tcl-Tk disponible pour toutes les plates-formes cibles. En termes de déploiement cela signifie qu'il y a en tout et pour tout que deux fichiers à copier sur le disque&nbsp;: l'interprète Tclkit + le starkit. Nul besoin d'installer Tcl-Tk.
Remarquons qu'un starkit peut être exécuté par un interprète classique (tclsh, wish).
</p>
<div class="mw-heading mw-heading3"><h3 id="Starpack">Starpack</h3></div>
<p>Le Starpack<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> est un exécutable dans lequel sont incorporés les codes source d'une application sous la forme d'un <i>starkit</i> avec un interprète Tcl-Tk. En termes de déploiement cela signifie simplement qu'il n'y a qu'un seul fichier. Son installation consiste à le copier sur le disque et sa désinstallation consiste à le supprimer du disque. À la différence du starkit, le starpack est spécifique à la plate-forme cible. Encore une fois, nul besoin d'installer Tcl-Tk.
</p>
<div class="mw-heading mw-heading2"><h2 id="Programmation_orientée_objet"><span id="Programmation_orient.C3.A9e_objet"></span>Programmation orientée objet</h2></div>
<p>Tcl dispose nativement de la programmation orientée objet depuis la version 8.6 (<time class="nowrap" datetime="2012-12-20" data-sort-value="2012-12-20">20 décembre 2012</time>). Il s'agit d'un système objet basé sur les <a href="Classe_(informatique)" title="Classe (informatique)">classes</a>, les <a href="M%C3%A9taclasse" title="Métaclasse">métaclasses</a>, les filtres, les slots et les <a href="Mixin" title="Mixin">mixins</a>. La syntaxe est la suivante&nbsp;:
</p>
<pre>objet méthode arg1 arg2 ....
</pre>
<p>Exemple:
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">oo</span><span class="o">::</span>class<span class="w"> </span>create<span class="w"> </span>DistributeurTicket<span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="k">variable</span><span class="w"> </span>compteur
<span class="w"> </span>
<span class="w"> </span><span class="nv">constructor</span><span class="w"> </span><span class="k">{}</span><span class="w"> </span><span class="k">{set</span><span class="w"> </span>compteur<span class="w"> </span><span class="mi">0</span><span class="k">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="nv">method</span><span class="w"> </span>donneTicket<span class="w"> </span><span class="k">{{</span><span class="nv">ticket</span><span class="w"> </span><span class="mi">1</span><span class="k">}}</span><span class="w"> </span><span class="k">{</span><span class="w"> </span>
<span class="w"> </span><span class="nb">incr</span><span class="w"> </span>compteur
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="k">{set</span><span class="w"> </span>i<span class="w"> </span><span class="mi">0</span><span class="k">}</span><span class="w"> </span><span class="k">{</span><span class="nv">$i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="nv">$ticket</span><span class="k">}</span><span class="w"> </span><span class="k">{</span><span class="nb">incr</span><span class="w"> </span>i<span class="k">}</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"Voici le ticket n° $i pour la commande $compteur"</span>
<span class="w"> </span><span class="k">}</span>
<span class="w"> </span><span class="k">}</span>
<span class="k">}</span>

<span class="k">set</span><span class="w"> </span>macommande<span class="w"> </span><span class="k">[</span><span class="nv">DistributeurTicket</span><span class="w"> </span>new<span class="k">]</span>
<span class="nv">$macommande</span><span class="w"> </span><span class="nv">donneTicket</span><span class="w"> </span><span class="mi">2</span>
</pre></div>
<p>L'inclusion de la <a href="Programmation_orient%C3%A9e_objet" title="Programmation orientée objet">POO</a> dans le noyau de Tcl a été un sujet de discussion récurrent au sein de la communauté des utilisateurs de ce langage. Les avis étaient partagés principalement pour trois raisons&nbsp;:
</p>
<ul><li>la <a href="Programmation_orient%C3%A9e_objet" title="Programmation orientée objet">POO</a> n'est pas le seul <a href="Paradigme_(programmation)" title="Paradigme (programmation)">paradigme</a> adaptable</li>
<li>une volonté de conserver un noyau compact</li>
<li>les diverses adaptations possibles des concepts objets</li></ul>
<p>Pour cette dernière raison, Tcl avait déjà accès à plusieurs extensions objets.
</p>
<table class="wikitable">
<tbody><tr>
<th>Extension</th>
<th>Mise en œuvre</th>
<th>Description du modèle
</th></tr>
<tr>
<td>XOTcl</td>
<td>C</td>
<td>Définition dynamique des <a href="Classe_(informatique)" title="Classe (informatique)">classes</a>, <a href="M%C3%A9taclasse" title="Métaclasse">métaclasses</a> et des méthodes avec instrospection. <a href="H%C3%A9ritage_(informatique)" title="Héritage (informatique)">Héritage</a> simple et multiple. Agrégation dynamique d'objets, classes imbriquées, <a href="Mixin" title="Mixin">mixins</a>, filtre conditionnel, slots. Influencé par <a href="Common_Lisp_Object_System" title="Common Lisp Object System">CLOS</a>, <a href="Smalltalk" title="Smalltalk">Smalltalk</a> et <a href="Self_(langage)" title="Self (langage)">Self</a>.
</td></tr>
<tr>
<td><a href="Incr_Tcl" title="Incr Tcl">incr Tcl</a></td>
<td>C</td>
<td>Calqué sur le modèle objet du <a href="C%2B%2B" title="C++">C++</a>. Héritage multiple. Classes privées et publiques.
</td></tr>
<tr>
<td>OTcl</td>
<td>C</td>
<td>Définition dynamique des classes, méta-classes et des méthodes avec instrospection. Héritage simple et multiple. Influencé par <a href="Common_Lisp_Object_System" title="Common Lisp Object System">CLOS</a>, <a href="Smalltalk" title="Smalltalk">Smalltalk</a> et <a href="Self_(langage)" title="Self (langage)">Self</a>.
</td></tr>
<tr>
<td>Snit</td>
<td>Tcl</td>
<td>Modèle basé sur la délégation au lieu de l'héritage
</td></tr>
<tr>
<td>STOOP</td>
<td>Tcl</td>
<td>Proche du modèle objet du <a href="C%2B%2B" title="C++">C++</a>. Switch class.
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Plateformes">Plateformes</h2></div>
<p>Tcl est disponible pour la plupart des plateformes utilisées couramment. C'est-à-dire <a href="Microsoft_Windows" title="Microsoft Windows">Windows</a> CE/PocketPC/9x/NT/2000/XP/Vista/7/8/10, <a href="Mac_OS" class="mw-redirect" title="Mac OS">Mac OS</a> 7/8/9/X ainsi que les plateformes dérivées d'<a href="UNIX" class="mw-redirect" title="UNIX">UNIX</a> telles que <a href="Linux" title="Linux">Linux</a>, <a href="Android" title="Android">Android</a>, <a href="Berkeley_Software_Distribution" title="Berkeley Software Distribution">BSD</a>, <a href="AIX" title="AIX">AIX</a>, <a href="HP-UX" title="HP-UX">HP-UX</a>, <a href="IRIX" title="IRIX">IRIX</a>, <a href="Solaris_(syst%C3%A8me_d'exploitation)" title="Solaris (système d'exploitation)">Solaris</a>, <a href="OS/400" title="OS/400">OS/400</a>, <a href="LynxOS" title="LynxOS">LynxOS</a>, <a href="QNX" title="QNX">QNX</a> et <a href="Cisco_IOS" title="Cisco IOS">Cisco IOS</a>.
</p><p>De par son ancienneté, Tcl existe dans des versions antérieures plus rares pour des systèmes d'exploitation comme <a href="Virtual_Memory_System" class="mw-redirect" title="Virtual Memory System">VMS</a>, <a href="OS/2" title="OS/2">OS/2</a>, Ultrix, <a href="SCO_OpenServer" title="SCO OpenServer">SCO OpenServer</a>, <a href="OS-9" title="OS-9">OS-9</a>, Unicos.
</p>
<div class="mw-heading mw-heading2"><h2 id="Distributions">Distributions</h2></div>
<p>L'installation de Tcl peut se faire en compilant les codes sources sur la plateforme cible. Cependant il existe des distributions binaires qui ont l'avantage de proposer en plus du langage des extensions précompilées.
</p>
<dl><dt>ActiveTcl<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup></dt>
<dd>ActiveTcl est la distribution la plus complète de Tcl/Tk. Elle est proposée par la société Activestate et livrée avec de nombreuses extensions précompilées et des bibliothèques. Il existe des versions pour Windows, Mac OS X, Linux, Solaris, AIX et HP-UX.</dd>
<dt>WinTclTk<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup></dt>
<dd>WinTclTk est une distribution de Tcl-Tk uniquement pour Windows accompagnée d'extensions précompilées (dont certaines spécifiques à Windows), de bibliothèques et d'utilitaires.</dd>
<dt>eTcl<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup></dt>
<dd>eTcl est une distribution française qui se présente sous la forme d'un seul exécutable. Elle est destinée en particulier aux PDA et aux appareils mobiles (Windows CE/Pocket PC/<a href="Windows_Mobile" title="Windows Mobile">Windows Mobile</a>/<a href="Android" title="Android">Android</a>). Cependant, elle fonctionne aussi sur les plateformes Windows, Mac OS X et Linux. eTcl est très compact et comprend, en plus de Tcl-Tk, des extensions telles que <a href="SQLite" title="SQLite">SQLite</a> ou un compilateur C autonome à la volée.</dd>
<dt>Wize<sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup></dt>
<dd>Wize (Wish Integrated Zip Executable) est une distribution se pilotant à partir d'un environnement de développement intégré et incorporant un système de fichier basé sur le format <a href="ZIP_(format_de_fichier)" title="ZIP (format de fichier)">ZIP</a>. Il dispose de <a href="SQLite" title="SQLite">SQLite</a>, d'un compilateur de <a href="Bytecode" title="Bytecode">bytecode</a>, de la gestion du son, des graphismes 3D et des fenêtres non-rectangulaires. Il existe des versions pour Windows et Linux.</dd>
<dt>Magicsplat Tcl/Tk for Windows<sup id="cite_ref-13" class="reference"><a href="#cite_note-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup></dt>
<dd>Magicsplat Tcl/Tk for Window est une distribution de Tcl-Tk uniquement pour Windows accompagnée d'extensions précompilées (dont certaines spécifiques à Windows), de bibliothèques et d'utilitaires. Des versions 32-bits et 64-bits existent.</dd></dl>
<p>La plupart des distributions Linux proposent par défaut une installation de base de Tcl-Tk, voire parfois les extensions qui vont avec. Pour se rendre compte de la présence de Tcl sous Linux, il suffit de saisir sur la ligne de commande: <code>tclsh</code>.
Excepté dans le cas d'implémentations spécifiques Tcl est toujours distribué avec Tk, formant ainsi le langage Tcl-Tk.
</p>
<div class="mw-heading mw-heading2"><h2 id="Implémentations_spécifiques"><span id="Impl.C3.A9mentations_sp.C3.A9cifiques"></span>Implémentations spécifiques</h2></div>
<dl><dt>Jacl<sup id="cite_ref-14" class="reference"><a href="#cite_note-14"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup></dt>
<dd>Jacl est une implémentation de Tcl écrite entièrement en Java qui permet d'embarquer un langage de script dans une application Java.</dd>
<dt>Jim<sup id="cite_ref-15" class="reference"><a href="#cite_note-15"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup></dt>
<dd>Jim est une implémentation de Tcl qui inclut un sous-ensemble des commandes de la version officielle de Tcl plus des fonctionnalités spécifiques comme le dictionnaire, la clôture, les fonctions anonymes (lambda). Cet interprète tient dans seulement 85Ko.</dd>
<dt>Tcljs<sup id="cite_ref-16" class="reference"><a href="#cite_note-16"><span class="cite-bracket">[</span>16<span class="cite-bracket">]</span></a></sup></dt>
<dd>Tcljs est une implémentation de Tcl écrite entièrement en JavaScript qui permet d'embarquer Tcl dans un navigateur compatible.</dd>
<dt>Hecl<sup id="cite_ref-17" class="reference"><a href="#cite_note-17"><span class="cite-bracket">[</span>17<span class="cite-bracket">]</span></a></sup></dt>
<dd>Hecl est un langage de script dont la syntaxe dérive de Tcl. Il est destiné aux téléphones mobiles qui supportent une plateforme Java compatible <a href="Java_2_Micro_Edition" class="mw-redirect" title="Java 2 Micro Edition">J2ME</a>.</dd>
<dt>NaTcl<sup id="cite_ref-18" class="reference"><a href="#cite_note-18"><span class="cite-bracket">[</span>18<span class="cite-bracket">]</span></a></sup></dt>
<dd>NaTcl est une implémentation de Tcl permettant d'exécuter des scripts Tcl dans le navigateur <a href="Google_Chrome" title="Google Chrome">Google Chrome</a> ou dans des programmes compatibles avec la technologie <a href="Google_Native_Client" title="Google Native Client">Native Client</a> (NaCl). Il permet de développer des applications Web avec Tcl et aussi d'accéder et de manipuler le contenu <a href="Document_Object_Model" title="Document Object Model">DOM</a> de Chrome.</dd></dl>
<div class="mw-heading mw-heading2"><h2 id="Bibliothèque_standard"><span id="Biblioth.C3.A8que_standard"></span>Bibliothèque standard</h2></div>
<p>Tcl dispose d'une <a href="Biblioth%C3%A8que_standard" title="Bibliothèque standard">bibliothèque standard</a> appelée <a rel="nofollow" class="external text" href="http://www.tcl.tk/software/tcllib/">Tcllib</a> (le pendant pour Tk étant la
Tklib) exclusivement écrite en Tcl. Elle contient 130 modules utilitaires couvrant une large gamme de domaines&nbsp;: protocoles de communication, <a href="Chiffrement" title="Chiffrement">chiffrement</a>, gestion de fichiers, structures de données, calcul numérique et mathématique, grammaire, terminaux, documentation automatique et utilitaires de texte.
</p><p>Exemples&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span></span><span class="c"># Opérateur somme</span>
<span class="k">namespace</span><span class="w"> </span>import<span class="w"> </span><span class="o">::</span>tcl::mathop::<span class="o">*</span>
<span class="nb">puts</span><span class="w"> </span><span class="k">[</span><span class="o">+</span><span class="w"> </span><span class="nv">1</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="mi">9</span><span class="w"> </span><span class="mi">10</span><span class="k">]</span>

<span class="c"># Maximum </span>
<span class="k">namespace</span><span class="w"> </span>import<span class="w"> </span><span class="o">::</span>tcl::mathfunc::max
<span class="nv">max</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="o">-</span><span class="mi">42</span>

<span class="c"># Cryptage RC4</span>
<span class="k">namespace</span><span class="w"> </span>import<span class="w"> </span><span class="o">::</span>tcl::rc4::<span class="o">*</span>
<span class="k">set</span><span class="w"> </span>crypt<span class="w"> </span><span class="k">[</span><span class="nv">rc4</span><span class="w"> </span><span class="o">-</span>key<span class="w"> </span>Secret<span class="w"> </span><span class="s2">"Hello, World!"</span><span class="k">]</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Internet_et_réseaux"><span id="Internet_et_r.C3.A9seaux"></span>Internet et réseaux</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Tcl_Plugin_et_les_tclets">Tcl Plugin et les tclets</h3></div>
<p>Le Tcl Plugin est un plugin qui permet d'exécuter des tclets (<a href="Applet" title="Applet">applets</a> écrits en Tcl-Tk) dans un navigateur Web. Ce dernier interprète une application Tcl-Tk dans un environnement sécurisé appelé <a rel="nofollow" class="external text" href="http://www.tcl.tk/software/plugin/safetcl.html">Safe-Tcl</a> qui garantit l'intégrité
de l'application hôte (le navigateur dans ce cas).
</p>
<div class="mw-heading mw-heading3"><h3 id="Serveurs_web">Serveurs web</h3></div>
<p>Comme la plupart des <a href="Langage_de_script" title="Langage de script">langages de script</a> Tcl a vocation à être exécuté à partir d'un <a href="Serveur_HTTP" class="mw-redirect" title="Serveur HTTP">serveur HTTP</a>.
</p>
<div class="mw-heading mw-heading4"><h4 id="Tclhttpd">Tclhttpd</h4></div>
<p>Tclhttpd est serveur web léger écrit uniquement en Tcl. Il a l'avantage d'être extensible à souhait et multiplateforme. Il peut servir de base à l'écriture d'un serveur d'application ou être embarqué pour gérer par exemple un système d'aide en ligne ou un moteur de recherche sur CD-ROM.
</p>
<div class="mw-heading mw-heading4"><h4 id="Apache,_mod_tcl,_Rivet_et_Websh"><span id="Apache.2C_mod_tcl.2C_Rivet_et_Websh"></span>Apache, mod_tcl, Rivet et Websh</h4></div>
<p>À partir du <a href="Serveur_HTTP" class="mw-redirect" title="Serveur HTTP">serveur HTTP</a> <a href="Apache_HTTP_Server" title="Apache HTTP Server">Apache</a> plusieurs options sont disponibles. Il y a tout d'abord le module <a rel="nofollow" class="external text" href="https://tcl.apache.org/mod_tcl/">mod_tcl</a> qui se contente d'embarquer un interprète Tcl. Et ensuite les modules <a rel="nofollow" class="external text" href="https://tcl.apache.org/rivet/">Rivet</a> et <a rel="nofollow" class="external text" href="https://tcl.apache.org/websh/">Websh</a> qui sont plus élaborés avec la prise en charge de la gestion des bases de données et des systèmes de templates.
</p>
<div class="mw-heading mw-heading4"><h4 id="AOLserver">AOLserver</h4></div>
<p>AOLserver est un serveur web open source développé par la société <a href="AOL" title="AOL">AOL</a> qui embarque un interprète Tcl. Il est <a href="Processus_l%C3%A9ger" class="mw-redirect" title="Processus léger">multithread</a>, extensible, utilisable à grande échelle et gère les <a href="Pages_web_statiques" class="mw-redirect" title="Pages web statiques">pages web statiques</a> et <a href="Page_web_dynamique" title="Page web dynamique">dynamiques</a>. Il intègre un support complet des bases de données.
</p>
<div class="mw-heading mw-heading3"><h3 id="Système_de_gestion_de_contenu"><span id="Syst.C3.A8me_de_gestion_de_contenu"></span>Système de gestion de contenu</h3></div>
<p>Le système de gestion de contenu le plus connu basé sur Tcl est OpenACS (<i>Open Architecture Community System</i>). Il s'appuie sur le serveur web AOLserver et supporte les bases de données Oracle et <a href="PostgreSQL" title="PostgreSQL">PostgreSQL</a>. OpenACS est utilisé pour concevoir de sites web collaboratifs, des sites de commerce en ligne, des <a href="Progiciel_de_gestion_int%C3%A9gr%C3%A9" title="Progiciel de gestion intégré">PGI</a> ou des systèmes d'apprentissage en ligne (<i>e-learning</i>) comme .LRN ou dotFolio.
</p>
<div class="mw-heading mw-heading3"><h3 id="Expect">Expect</h3></div>
<p><a href="Expect" title="Expect">Expect</a> est un outil basé sur Tcl-Tk pour automatiser les applications interactives telles que <a href="Telnet" title="Telnet">telnet</a>, <a href="File_Transfer_Protocol" title="File Transfer Protocol">ftp</a> <a href="Fsck" title="Fsck">fsck</a>, <a href="Rlogin" title="Rlogin">rlogin</a>, <a href="Rsh" title="Rsh">rsh</a> ou <a href="Secure_shell" class="mw-redirect" title="Secure shell">ssh</a>, ou pour automatiser des tests. Il est utilisé par exemple pour l'administration système.
</p>
<div class="mw-heading mw-heading2"><h2 id="Organisation_et_aspects_communautaires">Organisation et aspects communautaires</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Développement_de_Tcl-Tk"><span id="D.C3.A9veloppement_de_Tcl-Tk"></span>Développement de Tcl-Tk</h3></div>
<p>Le développement de Tcl-Tk est assuré par de nombreuses personnes qui apportent leurs contributions sous la forme de nouvelles fonctionnalités, de patches, de rapports de bogues ou de documentations.
Pour fédérer cet effort de développement, a été créé en 2000 le TCT (Tcl Core Team).
</p><p>Le TCT est constitué d'un collège de 12 experts, dont John Ousterhout ne fait plus partie. Son activité est coordonnée par l'intermédiaire de TIPs (<i>Tcl improvement proposals</i>). Le TIP est un document qui décrit un projet d'amélioration de Tcl. N'importe qui peut écrire un TIP et le soumettre au TCT pour discussion et approbation lors d'un vote.
</p><p>Un site rassemble tous les TIPs et renseigne sur leur état d'avancement.
</p><p>Pour ce qui est de la partie opérationnelle le développement collaboratif de Tcl-Tk est hébergé sur un site spécifique avec le logiciel de gestion de versions décentralisé <a href="Fossil_(logiciel)" title="Fossil (logiciel)">Fossil</a>.
</p><p>Par rapport à d'autres langages de script, le rythme de publication des versions importantes de Tcl-Tk n'est pas annuel. La priorité est avant tout axée sur la stabilité. Il y a d'ailleurs une rétrocompatibilité pour toutes les versions de la branche 8.x.
</p>
<div class="mw-heading mw-heading3"><h3 id="Ressources_communautaires">Ressources communautaires</h3></div>
<p>L'activité d'échange et de communication entre utilisateurs se concentre essentiellement sur le wiki et le groupe de discussion. Les wikis les plus actifs sont le wiki anglophone et francophone. Il en est de même pour
les groupes de discussion sur Usenet avec comp.lang.tcl et fr.comp.lang.tcl. Un chat permanent est organisé en anglais.
</p><p>À cela vient s'ajouter le site officiel de Tcl-Tk et les portails allemand, russe, chinois, coréen] et japonais.
</p><p>Une conférence annuelle a lieu aux États-Unis où sont présentés des cas d'utilisation de Tcl-Tk dans l'industrie par différents intervenants. C'est par ailleurs l'occasion de faire le point sur la feuille de route du langage.
Dans la même année une conférence européenne (EuroTcl) se tient en Allemagne ou en France selon le même principe.
</p><p>Des groupes d'utilisateurs existent aux États-Unis, Canada, Allemagne, Pays-Bas, Danemark, Angleterre et Corée.
</p>
<div class="mw-heading mw-heading2"><h2 id="Histoire_de_Tcl-Tk">Histoire de Tcl-Tk</h2></div>
<p>L'idée du langage Tcl est venue à <a href="John_Ousterhout" title="John Ousterhout">John K. Ousterhout</a> de ses travaux sur les outils logiciels d'aide à la conception de circuits intégrés à l'Université de Berkeley en Californie au début des années 1980. John Ousterhout et ses étudiants avaient développé quelques outils interactifs. Ils étaient tous dotés d'un langage de commande différent ce qui finissait par rendre compliqué l'enchaînement des tâches.
</p><p>En 1987, bénéficiant d'un congé sabbatique au Laboratoire de Recherche de Digital Equipment Corp., John Ousterhout se décida à harmoniser les différents langages de commande en créant un langage unique pour contrôler les applications. C'est ainsi que naquit Tcl (Tool Command Language) avec une syntaxe influencée par les langages <a href="C_(langage)" title="C (langage)">C</a>, <a href="Lisp_(langage)" class="mw-redirect" title="Lisp (langage)">Lisp</a>, <a href="Shell_(informatique)" class="mw-redirect" title="Shell (informatique)">Shell</a> et <a href="Awk" title="Awk">Awk</a>. Les premiers tests furent effectués sur une station DEC 3100 et une station SUN-3/75. Tcl représentait alors 7000 lignes de code en C dont la moitié était des commentaires. Il ne fonctionnait que sur les systèmes <a href="UNIX" class="mw-redirect" title="UNIX">UNIX</a>.
</p><p>Les objectifs primordiaux de ce langage interprété étaient les suivants&nbsp;:
</p>
<ul><li>Facile à apprendre et générique</li>
<li>Extensible</li>
<li>Pouvant être embarqué ou faire le lien avec des applications</li></ul>
<p>Tcl commença à être distribué lors d'une conférence industrielle à l'Université de Berkeley en 1989. En <time class="nowrap" datetime="1990-03" data-sort-value="1990-03">mars 1990</time>, John Ousterhout présenta un article sur Tcl à la <i>Conférence USENIX</i>. À la suite de nombreuses demandes, il mit à disposition librement les sources de Tcl2.1 sur le serveur FTP de l'université. Ceux-ci ne tardèrent pas à être copiés sur les autres serveurs FTP de par le monde. Parmi les personnes qui assistaient à cette conférence était présent un certain Don Libes du <a href="National_Institute_of_Standards_and_Technology" title="National Institute of Standards and Technology">NIST</a> (National Institute of Standards and Technology). Celui-ci étudiait une application pour automatiser des tâches sous <a href="UNIX" class="mw-redirect" title="UNIX">UNIX</a> et son travail n'avançait pas assez vite. Il comprit tout de suite que Tcl était une solution. À partir de Tcl, en trois semaines, il écrivit <a href="Expect" title="Expect">Expect</a>, un outil pour automatiser les applications interactives. Expect fut la première application écrite en Tcl à être largement distribuée, bénéficiant d'un grand crédit auprès des administrateurs systèmes.
</p><p>Parallèlement, John Ousterhout commença à travailler sur Tk en tant qu'extension pour concevoir des interfaces graphiques avec Tcl à la fin de 1988. En <time class="nowrap" datetime="1991-01" data-sort-value="1991-01">janvier 1991</time>, il présenta Tcl-Tk à la Conférence USENIX et à la Conférence X. Dès lors, la popularité de Tcl-Tk en tant que langage de script ne cessa de croître. Principalement pour deux raisons&nbsp;:
</p>
<ul><li>Sa capacité à être embarqué dans une application tout en créant ses propres commandes</li>
<li>La facilité avec laquelle on pouvait développer des interfaces graphiques (5 à 10 fois plus rapidement qu'avec <a href="Motif_(biblioth%C3%A8que_graphique)" title="Motif (bibliothèque graphique)">Motif</a>)</li></ul>
<p>Ce second point intéressait beaucoup les industriels.
</p><p>Une communauté se fédéra autour du langage et de nombreuses extensions commencèrent à voir le jour (dont TclX, Incr Tcl, BLT, Sybtcl, Oratcl, TclDP). La nécessité de communiquer davantage se fit sentir tant et si bien que John Ousterhout initia une liste de discussion. Mais le nombre d'utilisateurs croissant incita rapidement à la création du groupe de discussion comp.lang.tcl.
</p><p>En 1992 John Ousterhout cofonda, avec Larry Rowe un collègue de l'Université de Berkeley, la société <i>Perspecta Software</i> dans le but de commercialiser <i>Perspecta Presents</i>, un logiciel de présentation sous Unix basé sur Tcl-Tk. En 1993 Larry Rowe organisa la première conférence annuelle Tcl-Tk à Berkeley. Par la suite ces conférences coïncidaient avec la sortie des nouvelles versions du langage. Une session était dédiée à la discussion sur l'adjonction de nouvelles fonctionnalités
et la décision se faisait non sans humour par un vote approximatif à main levée connu sous le nom d'Ouster-vote.
</p><p>En <time class="nowrap" datetime="1994-05" data-sort-value="1994-05">mai 1994</time>, John Ousterhout quitta l'Université de Berkeley pour l'industrie à la suite d'une proposition de la société <a href="Sun_Microsystems" title="Sun Microsystems">Sun Microsystems</a> qui envisageait de faire de Tcl-Tk un langage de script universel pour Internet. Par cette réorientation professionnelle et la constitution d'une équipe (SunScript) au sein du Sun Microsystems Laboratories, John Ousterhout vit une opportunité d'assurer la pérennité du langage à long terme. Les clauses du contrat avec Sun Microsystems spécifiaient clairement que les codes sources de Tcl-Tk devaient rester librement accessibles. D'autres ne virent pas les choses de la même manière. Ainsi, le <time class="nowrap" datetime="1994-09-23" data-sort-value="1994-09-23">23 septembre 1994</time>, <a href="Richard_Stallman" title="Richard Stallman">Richard Stallman</a> posta sur <code>comp.lang.tcl</code> un message intitulé <i>Why you should not use Tcl</i> où il expliquait que Tcl n'était pas un vrai langage de programmation. De cette discussion enflammée<sup id="cite_ref-Tcl_War_19-0" class="reference"><a href="#cite_note-Tcl_War-19"><span class="cite-bracket">[</span>19<span class="cite-bracket">]</span></a></sup> naissait 1 mois plus tard le langage <a href="GNU_Guile" title="GNU Guile">Guile</a> qui se voulait être une alternative à Tcl. Avec le recul, personne n'a encore bien compris quelles étaient les réelles motivations de Richard Stallman pour une telle attaque. Cet épisode est connu sous le nom de <i>Tcl War</i>.
</p><p>Pendant ce temps-là, au laboratoire de Sun Microsystems, Scott Stanton, Ray Johnson et Jacob Levy améliorèrent le système de gestion des entrées/sorties de Tcl-Tk, ajoutèrent le support des sockets, mais surtout, écrivirent une version pour Windows et Macinstosh. Ce qui fit de Tcl-Tk un langage de script généraliste et multiplate-forme en <time class="nowrap" datetime="1996-04" data-sort-value="1996-04">avril 1996</time> avec Tcl7.5/Tk4.1. S'ensuivirent d'autres améliorations dont&nbsp;: un compilateur de <a href="Bytecode" title="Bytecode">bytecode</a> (qui augmenta la vitesse d'un facteur 10), le support des espaces de nom (<code>namespace</code>) et un plugin Tcl qui permettait d'exécuter des tclets (applets écrits en Tcl) dans un navigateur Web. Toutes ces innovations correspondaient à la version de Tcl-Tk 8.0 sortie en <time class="nowrap" datetime="1997-08" data-sort-value="1997-08">août 1997</time> où la décision fut prise d'aligner les numéros de version de Tk sur ceux de Tcl.
</p><p><time class="nowrap" datetime="1997-10" data-sort-value="1997-10">Octobre 1997</time> vit la création du <i>Tcl Consortium</i> dont l'objectif était de promouvoir Tcl-Tk et d'accroître encore plus sa visibilité sur le marché de l'informatique. Ce consortium était financé par Sun Microsystems et avait à sa tête Peter H. Salus (ancien directeur exécutif de l'Association USENIX et du Sun User Group, mais aussi vice-président de la Free Software Fondation). Hormis John Ousterhout, le comité consultatif comptait parmi ses membres <a href="Brian_Kernighan" title="Brian Kernighan">Brian W. Kernighan</a> (cocréateur de <a href="Awk" title="Awk">Awk</a>).
</p><p>Durant ces années, Tcl-Tk fut fortement impliquée dans la technologie des <a href="Agent_(informatique)" class="mw-redirect" title="Agent (informatique)">agents mobiles</a>.
</p><p>À la fin de l'année 1997, John Ousterhout quitta Sun Microsystems pour cofonder la société Scriptics après que son employeur eut décidé d'annuler les projets de commercialisation d'outils de développement spécifiques au langage. Scriptics prit le relais en offrant des services autour de Tcl-Tk et en commercialisant notamment la suite d'outils TclPro. Le développement et la maintenance de Tcl-Tk furent alors transférés chez Scriptics avec une partie de l'équipe Tcl-Tk de Sun Microsystems. Les langages de script étaient alors en plein essor.
</p><p>Au printemps 1998, Tcl-Tk reçut deux prix. Tout d'abord le prix de l'ACM Software System qui récompense les logiciels qui ont eu une influence durable et ensuite le prix STUG (USENIX Software Tools User Group).
</p><p>En <time class="nowrap" datetime="1998-08" data-sort-value="1998-08">août 1998</time>, lors d'une conférence sur l'open source et les modèles économiques à San José en Californie, Richard Stallman monta à la tribune et prit le micro pour déclarer que John Ousterhout était un «&nbsp;parasite&nbsp;» du mouvement des logiciels libres.
</p><p>En <time class="nowrap" datetime="1999-04" data-sort-value="1999-04">avril 1999</time> sortit la version Tcl-Tk 8.1. Elle intégrait un nouveau moteur d'<a href="Expression_r%C3%A9guli%C3%A8re" title="Expression régulière">expressions rationnelles</a> (celui d'<a href="https://en.wikipedia.org/wiki/Henry_Spencer" class="extiw external" title="en:Henry Spencer">Henry Spencer</a>) et le support d'Unicode. Sortie trop précipitamment, cette version s'avérait instable. Tant et si bien que la version 8.2 sortit 3 mois après pour corriger les imperfections.
</p><p>En <time class="nowrap" datetime="2000-05" data-sort-value="2000-05">mai 2000</time>, la société Scriptics prit le nom d'Ajuba Solutions s'orientant plus vers des solutions de serveurs basés sur Tcl et la technologie <a href="Extensible_Markup_Language" title="Extensible Markup Language">XML</a>, en plein développement à cette période.
</p><p>En <time class="nowrap" datetime="2000-10" data-sort-value="2000-10">octobre 2000</time>, elle fut rachetée par la société Interwoven. Peu intéressée par les logiciels libres, celle-ci autorisa le passage en opensource de la suite TclPro (dont la licence monoposte valait 1000 dollars). Le cas de la maintenance et du développement de Tcl-Tk avait déjà été anticipé avec la création en <time class="nowrap" datetime="2000-08" data-sort-value="2000-08">août 2000</time> du TCT (Tcl Core Team) un groupe constitué d'un collège d'experts indépendants de toute structure commerciale. C'est à cette époque que John Ousterhout (également membre du TCT) décida de ne plus assurer son rôle de <a href="Benevolent_Dictator_for_Life" title="Benevolent Dictator for Life">dictateur bénévole</a> et se tourna vers la gestion et la planification de projets informatiques.
</p><p>En <time class="nowrap" datetime="2000-02" data-sort-value="2000-02">février 2000</time> sortit la version de Tcl-Tk 8.3 qui avait déjà été élaborée chez Scriptics. La réelle efficacité du TCT ne put s'exprimer qu'avec la sortie de Tcl-Tk 8.4 en <time class="nowrap" datetime="2002-09" data-sort-value="2002-09">septembre 2002</time> avec entre autres un travail de fond sur les mécanismes internes du langage et l'adjonction d'un système de fichier virtuel. Après quatre années de développement, sort en <time class="nowrap" datetime="2007-12" data-sort-value="2007-12">décembre 2007</time> Tcl-Tk 8.5. Cette version apporte de nombreux changements pour Tcl-Tk en allant vers la programmation fonctionnelle.
</p><p>En <time class="nowrap" datetime="2008-01" data-sort-value="2008-01">janvier 2008</time> Tcl fait partie des onze projets open source certifiés les plus sûrs selon la société Coverity mandatée par le ministère de l'intérieur américain (DHS - Department of Homeland Security) pour mener une étude sur la sécurité des applications. En <time class="nowrap" datetime="2008-03" data-sort-value="2008-03">mars 2008</time> démarre le développement de la branche 8.6 avec deux axes principaux&nbsp;: l'inclusion de la programmation orientée objets dans le noyau et rendre Tcl stackless (ie minimiser l'utilisation de la pile du langage <a href="C_(langage)" title="C (langage)">C</a>). Le <time class="nowrap" datetime="2012-12-20" data-sort-value="2012-12-20">20 décembre 2012</time> sort la version 8.6 de Tcl-Tk. En plus d'être dotée d'un système objet, elle supporte la <a href="R%C3%A9cursion_terminale" title="Récursion terminale">récursion terminale</a>, les <a href="Coroutine" title="Coroutine">coroutines</a>, la <a href="Continuation_(informatique)" title="Continuation (informatique)">continuation</a> et la <a href="Programmation_concurrente" title="Programmation concurrente">programmation concurrente</a>.
</p><p>Le 26 septembre 2024, sort la version de Tcl-Tk 9.0. Elle gère les données uniquement en 64-bit et l'encodage par défaut d'un script est dorénavant l'UTF-8 en sachant que le langage bénéficie du support étendu d'Unicode. Par ailleurs, Tcl-Tk 9.0 intègre un système de fichier virtuel basé sur le format de compression zip. La version 8.7 ne sortira pas officiellement au profit de la version 9.0 qui bénéficie en plus d'un nouveau logo.
</p>
<div class="mw-heading mw-heading2"><h2 id="Historique_des_versions_significatives">Historique des versions significatives</h2></div>
<table class="wikitable">
<tbody><tr>
<th>Version</th>
<th>Date de sortie</th>
<th>Principales nouveautés
</th></tr>
<tr>
<td>9.0
</td>
<td>26 décembre 2024
</td>
<td>
<ul><li>Données uniquement en 64-bit</li>
<li>Support étendu d'Unicode avec l'UTF-8 comme encodage par défaut</li>
<li>Système de fichier virtuel basé sur le format zip dans le langage</li>
<li>De nouvelles commandes de listes (<code>lpop, lremove, ledit</code> et <code>lseq</code>)</li>
<li>Nouvelles commandes de coroutines (<code>coroinject</code> et <code>coroprobe</code>)</li>
<li>Déclaration de constantes avec <code>const</code></li>
<li>Remplacement de <code>select</code> par <code>epoll/kqueue</code></li></ul>
</td></tr>
<tr>
<td>8.6</td>
<td><time class="nowrap" datetime="2012-12-20" data-sort-value="2012-12-20">20 décembre 2012</time></td>
<td>
<ul><li>Système objet dans le noyau</li>
<li>Tcl devient stackless</li>
<li>Les coroutines et la récursion terminale (commandes <code>coroutine, yield, tailcall</code>)</li>
<li>Gestion des exceptions (commandes <code>try,trap,finally</code>)</li>
<li>Interface commune pour les bases de données SQL (<code>tdbc::*</code>)</li>
<li>Compatibilité avec IPv6</li>
<li>Canaux virtuels (commande <code>chan push/pop</code>)</li>
<li>Extension des commandes de gestion des listes (commande <code>lmap</code>)</li>
<li>Filtrage de dictionnaire</li>
<li>Compression zlib dans le noyau</li></ul>
</td></tr>
<tr>
<td>8.5</td>
<td><time class="nowrap" datetime="2007-12-20" data-sort-value="2007-12-20">20 décembre 2007</time></td>
<td>
<ul><li>Fonctions anonymes (commande <code>apply</code>)</li>
<li>Expansion des arguments (commande <code>{*}</code>)</li>
<li>Commande spécifique (<code>chan</code>) pour manipuler les canaux</li>
<li>Dictionnaire (commande <code>dict</code>)</li>
<li>Extension de la commande <code>expr</code> avec de nouveaux opérateurs mathématiques</li>
<li>Extension des commandes de gestion des listes</li>
<li>Refonte de la commande de gestion de la date et de l'heure</li>
<li>Amélioration de la vitesse d'exécution de 10&nbsp;% par rapport à la version précédente</li></ul>
</td></tr>
<tr>
<td>8.4</td>
<td><time class="nowrap" datetime="2002-09-10" data-sort-value="2002-09-10">10 septembre 2002</time></td>
<td>
<ul><li>Système de fichier virtuel et Starkit</li>
<li>Amélioration de la prise en charge du port série (multiplateforme)</li>
<li>Extension des commandes de gestion des listes</li>
<li>Statistique de distribution des données dans une table de hachage</li>
<li>Amélioration de la vitesse d'exécution de 25&nbsp;% par rapport à la version précédente</li></ul>
</td></tr>
<tr>
<td>8.3</td>
<td><time class="nowrap" datetime="2000-02-10" data-sort-value="2000-02-10">10 février 2000</time></td>
<td>
<ul><li>Extension de la commande des motifs globalisants (<code>glob</code>)</li>
<li>Extension des commandes de gestion des listes</li></ul>
</td></tr>
<tr>
<td>8.2</td>
<td><time class="nowrap" datetime="1999-08-17" data-sort-value="1999-08-17">17 août 1999</time></td>
<td>
<ul><li>Nouvelles sous-commandes à la fonction <code>string</code></li>
<li>Nouveau package <code>http</code></li>
<li>Implémentation de la Tcl Extension Architecture (TEA)</li></ul>
</td></tr>
<tr>
<td>8.1</td>
<td><time class="nowrap" datetime="1999-04-29" data-sort-value="1999-04-29">29 avril 1999</time></td>
<td>
<ul><li>Support d'Unicode</li>
<li>Extension du moteur d'expression régulière</li>
<li>Package DDE (Windows)</li></ul>
</td></tr>
<tr>
<td>8.0</td>
<td><time class="nowrap" datetime="1997-08-18" data-sort-value="1997-08-18">18 août 1997</time></td>
<td>
<ul><li>Compilation du bytecode à la volée</li>
<li>Manipulation des données binaires</li>
<li>Copie des données d'un canal à un autre</li>
<li>Espaces de nom (<code>namespace</code>)</li>
<li>Packages http et registres (Windows)</li></ul>
</td></tr>
<tr>
<td>7.5</td>
<td><time class="nowrap" datetime="1996-04-21" data-sort-value="1996-04-21">21 avril 1996</time></td>
<td>
<ul><li>Première version pour Windows et MacOS</li>
<li>Création de plusieurs interprètes dans une même application</li>
<li>Gestion des boucles d'évènement</li>
<li>Support des packages et chargement de bibliothèques extérieures</li>
<li>Support des sockets</li>
<li>Manipulation de la date et de l'heure</li></ul>
</td></tr>
<tr>
<td>6.6</td>
<td>février <a href="1993" title="1993">1993</a></td>
<td>
<ul><li>Structure de contrôle <code>elseif</code></li></ul>
</td></tr>
<tr>
<td>2.1</td>
<td><time class="nowrap" datetime="1990-03-03" data-sort-value="1990-03-03">3 mars 1990</time></td>
<td>
<ul><li>Première version grand public</li>
<li>Mécanisme de communication inter-application</li></ul>
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Commandes_de_base">Commandes de base</h2></div>
<div style="column-width:16em;margin:.3em 0;" class="colonnes"><div style="margin:-.3em 0;">
<ul><li>after</li>
<li>append</li>
<li>apply</li>
<li>array</li>
<li>auto_execok</li>
<li>auto_import</li>
<li>auto_load</li>
<li>auto_mkindex</li>
<li>auto_mkindex_oldfilename</li>
<li>auto_qualify</li>
<li>auto_reset</li>
<li>bgerror</li>
<li>binary</li>
<li>break</li>
<li>catch</li>
<li>cd</li>
<li>chan</li>
<li>clock</li>
<li>close</li>
<li>concat</li>
<li>continue</li>
<li>coroutine</li>
<li>dde *</li>
<li>dict</li>
<li>encoding</li>
<li>eof</li>
<li>error</li>
<li>eval</li>
<li>exec</li>
<li>exit</li>
<li>expr</li>
<li>fblocked</li>
<li>fconfigure</li>
<li>fcopy</li>
<li>file</li>
<li>fileevent</li>
<li>finally</li>
<li>flush</li>
<li>for</li>
<li>foreach</li>
<li>format</li>
<li>gets</li>
<li>glob</li>
<li>global</li>
<li>history</li>
<li>http</li>
<li>if</li>
<li>incr</li>
<li>info</li>
<li>interp</li>
<li>join</li>
<li>lappend</li>
<li>lassign</li>
<li>lindex</li>
<li>linsert</li>
<li>list</li>
<li>llength</li>
<li>lmap</li>
<li>load</li>
<li>lrange</li>
<li>lrepeat</li>
<li>lreplace</li>
<li>lreverse</li>
<li>lsearch</li>
<li>lset</li>
<li>lsort</li>
<li>mathfunc</li>
<li>mathop</li>
<li>memory</li>
<li>msgcat</li>
<li>namespace</li>
<li>open</li>
<li>package</li>
<li>parray</li>
<li>pid</li>
<li>pkg::create</li>
<li>pkg_mkIndex</li>
<li>platform</li>
<li>platform::shell</li>
<li>proc</li>
<li>puts</li>
<li>pwd</li>
<li>re_syntax</li>
<li>read</li>
<li>refchan</li>
<li>regexp</li>
<li>registry *</li>
<li>regsub</li>
<li>rename</li>
<li>return</li>
<li>scan</li>
<li>seek</li>
<li>set</li>
<li>socket</li>
<li>source</li>
<li>split</li>
<li>string</li>
<li>subst</li>
<li>switch</li>
<li>tailcall</li>
<li>tcl_endOfWord</li>
<li>tcl_findLibrary</li>
<li>tcl_startOfNextWord</li>
<li>tcl_startOfPreviousWord</li>
<li>tcl_wordBreakAfter</li>
<li>tcl_wordBreakBefore</li>
<li>tcltest</li>
<li>tclvars</li>
<li>tell</li>
<li>throw</li>
<li>time</li>
<li>tm</li>
<li>trace</li>
<li>trap</li>
<li>try</li>
<li>unknown</li>
<li>unload</li>
<li>unset</li>
<li>update</li>
<li>uplevel</li>
<li>upvar</li>
<li>variable</li>
<li>vwait</li>
<li>while</li>
<li>yield</li>
<li>yieldto</li>
<li>zlib</li></ul>
</div></div>
<p>(*): spécifique à la plateforme Windows
</p>
<div class="mw-heading mw-heading2"><h2 id="Extensions_et_bibliothèques_les_plus_utilisées"><span id="Extensions_et_biblioth.C3.A8ques_les_plus_utilis.C3.A9es"></span>Extensions et bibliothèques les plus utilisées</h2></div>
<p>Graphisme&nbsp;:
</p>
<ul><li><a href="VTK" title="VTK">VTK</a>&nbsp;: bibliothèque de visualisation de données</li>
<li>Tcl3d&nbsp;: support d'OpenGL avec Tcl</li>
<li>VRS&nbsp;: bibliothèque 3D interactive</li>
<li>TkPath&nbsp;: extension <a href="Scalable_Vector_Graphics" title="Scalable Vector Graphics">SVG</a></li>
<li>PDF4Tcl&nbsp;: extension <a href="Portable_Document_Format" title="Portable Document Format">PDF</a></li>
<li>QuicktimeTcl&nbsp;: extension <a href="QuickTime" title="QuickTime">QuickTime</a></li></ul>
<p>Son&nbsp;:
</p>
<ul><li>Snack&nbsp;: boîte à outils de traitement sonore</li>
<li><a href="Csound" title="Csound">Csound</a>&nbsp;: instruments virtuels et traitement sonore</li></ul>
<p>Internet et réseaux&nbsp;:
</p>
<ul><li>TclSOAP&nbsp;: protocol <a href="SOAP" title="SOAP">SOAP</a> et <a href="XML-RPC" title="XML-RPC">XML-RPC</a></li>
<li>Scotty&nbsp;: protocol <a href="Simple_network_management_protocol" class="mw-redirect" title="Simple network management protocol">SNMP</a></li>
<li>MIB Smithy SDK&nbsp;: protocol <a href="Simple_network_management_protocol" class="mw-redirect" title="Simple network management protocol">SNMP</a></li>
<li>Tclcurl&nbsp;: extension <a href="CURL" title="CURL">cURL</a></li></ul>
<p>Système de gestion de base de données&nbsp;:
</p>
<ul><li>OraTcl&nbsp;: <a href="Oracle_(base_de_donn%C3%A9es)" class="mw-redirect" title="Oracle (base de données)">Oracle</a></li>
<li>SQLite&nbsp;: <a href="SQLite" title="SQLite">SQLite</a></li>
<li>Mk4Tcl&nbsp;: Metakit</li>
<li>PgTcl&nbsp;: <a href="PostgreSQL" title="PostgreSQL">PostgreSQL</a></li>
<li>PgTclng&nbsp;: <a href="PostgreSQL" title="PostgreSQL">PostgreSQL</a></li>
<li>MySQLTcl&nbsp;: <a href="MySQL" title="MySQL">MySQL</a></li>
<li>SnODBC&nbsp;: interface <a href="Open_Database_Connectivity" title="Open Database Connectivity">ODBC</a></li></ul>
<p>Spécifique à Windows&nbsp;:
</p>
<ul><li>Tcom&nbsp;: API <a href="Component_Object_Model" title="Component Object Model">COM</a></li>
<li>TWAPI :API Win32</li>
<li>CAWT&nbsp;: API <a href="Component_Object_Model" title="Component Object Model">COM</a></li>
<li>LPTTCL&nbsp;: port parallèle</li></ul>
<p>Autres&nbsp;:
</p>
<ul><li>TclXML&nbsp;: <a href="Extensible_Markup_Language" title="Extensible Markup Language">XML</a>, <a href="Document_Object_Model" title="Document Object Model">DOM</a> et <a href="Extensible_Stylesheet_Language_Transformations" title="Extensible Stylesheet Language Transformations">XSLT</a></li>
<li>Critcl&nbsp;: compilation de code C à la volée)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Produits_qui_utilisent_Tcl-Tk">Produits qui utilisent Tcl-Tk</h2></div>
<div style="column-width:20em;margin:.3em 0;" class="colonnes"><div style="margin:-.3em 0;">
<ul><li>AC3D&nbsp;<a href="https://en.wikipedia.org/wiki/AC3D" class="extiw external" title="en:AC3D"><span class="indicateur-langue" title="Article en anglais&nbsp;: «&nbsp;AC3D&nbsp;»">(en)</span></a></li>
<li><a href="AMSN" title="AMSN">aMSN</a></li>
<li><a href="ANSYS" class="mw-redirect" title="ANSYS">ANSYS</a></li>
<li><a href="BRL-CAD" title="BRL-CAD">BRL-CAD</a></li>
<li>Calibre DESIGNrev</li>
<li>Carmaker (IPG)</li>
<li><a href="Code_Aster" class="mw-redirect" title="Code Aster">Code Aster</a></li>
<li><a href="Code_Saturne" class="mw-redirect" title="Code Saturne">Code Saturne</a></li>
<li><a href="ENOVIA" title="ENOVIA">ENOVIA</a></li>
<li>GiD</li>
<li>Gridgen</li>
<li>Kadviser</li>
<li><a href="Maxima_(logiciel)" title="Maxima (logiciel)">Maxima</a></li>
<li><a href="Mentor_Graphics" title="Mentor Graphics">Mentor Graphics</a></li>
<li><a href="Network_Simulator" title="Network Simulator">NS2</a></li>
<li><a href="Nuke_(logiciel)" title="Nuke (logiciel)">Nuke</a></li>
<li><a href="Open_CASCADE_Technology" title="Open CASCADE Technology">Open CASCADE</a></li>
<li><a href="R_(langage_de_programmation_et_environnement_statistique)" class="mw-redirect" title="R (langage de programmation et environnement statistique)">R</a></li>
<li>RattleCAD</li>
<li><a href="RenderMan_Interface_Specification" title="RenderMan Interface Specification">RenderMan</a></li>
<li><a href="Scilab" title="Scilab">Scilab</a></li>
<li><a href="TiVo" title="TiVo">TiVo</a></li>
<li><a href="VTK" title="VTK">VTK</a></li>
<li><a href="Cisco_IOS" title="Cisco IOS">Cisco IOS</a></li>
<li>eTktab</li>
<li>Quartus (Altera)</li></ul></div></div>
<div class="mw-heading mw-heading2"><h2 id="Notes_et_références"><span id="Notes_et_r.C3.A9f.C3.A9rences"></span>Notes et références</h2></div>
<div class="references-small decimal" style=""><div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-wikidata-812bc74b3335ac4dc35825393705ee31bb67cc23-1"><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://sourceforge.net/p/tcl/mailman/message/59201776/"><cite style="font-style:normal;"><span class="lang-en" lang="en">[TCLCORE] Tcl 9.0.2 RELEASED</span></cite></a>&nbsp;», <time class="nowrap" datetime="2025-07-02" data-sort-value="2025-07-02">2 juillet 2025</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2025-07-03" data-sort-value="2025-07-03">3 juillet 2025</time>)</small></span></span>
</li>
<li id="cite_note-wikidata-62d05b2d71b15acf2b1759f208f6de53ce306ed6-2"><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="http://core.tcl.tk/tcl/finfo?name=changes"><cite style="font-style:normal;">http://core.tcl.tk/tcl/finfo?name=changes</cite></a>&nbsp;»</span></span>
</li>
<li id="cite_note-wikidata-9ed4f6b82a6f7f1e060fa15081745f84e1d20ef8-3"><span class="mw-cite-backlink"><a href="#cite_ref-wikidata-9ed4f6b82a6f7f1e060fa15081745f84e1d20ef8_3-0">↑</a> </span><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://sourceforge.net/projects/tcl/files/Tcl/8.7a1/tcltk-release-notes-8.7a1.txt/view"><cite style="font-style:normal;">https://sourceforge.net/projects/tcl/files/Tcl/8.7a1/tcltk-release-notes-8.7a1.txt/view</cite></a>&nbsp;»</span></span>
</li>
<li id="cite_note-wikidata-52a9a089d4ebe7c06eeeb34cc72436e39c08e2ad-4"><span class="mw-cite-backlink"><a href="#cite_ref-wikidata-52a9a089d4ebe7c06eeeb34cc72436e39c08e2ad_4-0">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="https://sourceforge.net/p/tcl/mailman/message/37305939/"><cite style="font-style:normal;" lang="en"><span class="lang-en" lang="en">Tcl / Tk 8.7a5 RELEASED</span></cite></a>&nbsp;», <time class="nowrap" datetime="2021-06-18" data-sort-value="2021-06-18">18 juin 2021</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2021-10-16" data-sort-value="2021-10-16">16 octobre 2021</time>)</small></span></span>
</li>
<li id="cite_note-wikidata-8b22722242fe9f9ff7888041da53127f31ba671f-5"><span class="mw-cite-backlink"><a href="#cite_ref-wikidata-8b22722242fe9f9ff7888041da53127f31ba671f_5-0">↑</a> </span><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://sourceforge.net/p/tcl/mailman/message/58815083/"><cite style="font-style:normal;"><span class="lang-en" lang="en">[TCLCORE] Tcl/Tk 9.0.0 Release Candidates</span></cite></a>&nbsp;», <time class="nowrap" datetime="2024-09-10" data-sort-value="2024-09-10">10 septembre 2024</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2024-09-17" data-sort-value="2024-09-17">17 septembre 2024</time>)</small></span></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a> </span><span class="reference-text">Cf. infra <a href="#Ressources_communautaires">§ Ressources communautaires</a></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><a href="#cite_ref-7">↑</a> </span><span class="reference-text"><a rel="nofollow" class="external text" href="http://wfr.tcl.tk/46">Starkit</a></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><a href="#cite_ref-8">↑</a> </span><span class="reference-text"><a rel="nofollow" class="external text" href="http://wfr.tcl.tk/46">Starpack</a></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><a href="#cite_ref-9">↑</a> </span><span class="reference-text"><a rel="nofollow" class="external text" href="http://www.activestate.com/Products/activetcl/">ActiveTcl</a></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><a href="#cite_ref-10">↑</a> </span><span class="reference-text"> <a rel="nofollow" class="external text" href="http://wintcltk.sourceforge.net/">WinTclTk</a></span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><a href="#cite_ref-11">↑</a> </span><span class="reference-text"><a rel="nofollow" class="external free" href="http://www.evolane.com/software/etcl/">http://www.evolane.com/software/etcl/</a> eTcl]</span>
</li>
<li id="cite_note-12"><span class="mw-cite-backlink"><a href="#cite_ref-12">↑</a> </span><span class="reference-text"><a rel="nofollow" class="external text" href="http://pdqi.com/w/pw/pdqi/Wize/Wize">Wize</a></span>
</li>
<li id="cite_note-13"><span class="mw-cite-backlink"><a href="#cite_ref-13">↑</a> </span><span class="reference-text"><a rel="nofollow" class="external autonumber" href="https://www.magicsplat.com/tcl-installer/">[1]</a></span>
</li>
<li id="cite_note-14"><span class="mw-cite-backlink"><a href="#cite_ref-14">↑</a> </span><span class="reference-text"><a rel="nofollow" class="external text" href="http://tcljava.sourceforge.net/">Jacl</a></span>
</li>
<li id="cite_note-15"><span class="mw-cite-backlink"><a href="#cite_ref-15">↑</a> </span><span class="reference-text"><a rel="nofollow" class="external text" href="http://jim.tcl.tk/index.html/doc/www/www/index.html">Jim</a></span>
</li>
<li id="cite_note-16"><span class="mw-cite-backlink"><a href="#cite_ref-16">↑</a> </span><span class="reference-text"><a rel="nofollow" class="external text" href="http://wiki.tcl.tk/20291">Tcljs</a></span>
</li>
<li id="cite_note-17"><span class="mw-cite-backlink"><a href="#cite_ref-17">↑</a> </span><span class="reference-text"><a rel="nofollow" class="external text" href="http://www.hecl.org/">Hecl</a></span>
</li>
<li id="cite_note-18"><span class="mw-cite-backlink"><a href="#cite_ref-18">↑</a> </span><span class="reference-text"><a rel="nofollow" class="external text" href="http://wiki.tcl.tk/28211">NaTcl</a></span>
</li>
<li id="cite_note-Tcl_War-19"><span class="mw-cite-backlink"><a href="#cite_ref-Tcl_War_19-0">↑</a> </span><span class="reference-text"><span class="ouvrage" id="Stallman"><span class="ouvrage" id="Richard_Stallman">Richard Stallman, «&nbsp;<a rel="nofollow" class="external text" href="http://users.polytech.unice.fr/~eg/tcl-war.html"><cite style="font-style:normal;">Why you should not use Tcl</cite></a>&nbsp;», sur <span class="italique">Polytech Nice Sophia, page d'Erick Gallesio</span></span></span></span>
</li>
</ol></div>
</div>
<div class="mw-heading mw-heading3"><h3 id="Sources">Sources</h3></div>
<ul><li>John K. Ousterhout, <i>Scripting: Higher Level Programming for the 21st Century</i>, IEEE Computer magazine, March 1998 <a rel="nofollow" class="external autonumber" href="http://www.tcl.tk/doc/scripting.html">[2]</a></li>
<li>John K. Ousterhout, <i>Tcl: An Embeddable Command Language</i>, Proceedings of the USENIX Winter 1990 Technical Conference, pp133-146. <a rel="nofollow" class="external autonumber" href="http://wfr.tcl.tk/fichiers/ousterhout90tcl.pdf">[3]</a></li></ul>
<ul><li>John K. Ousterhout, <i>The Tcl Programming Language</i>, Dr. Dobb's Journal, vol. 19, Winter 1994.</li></ul>
<ul><li>John K. Ousterhout, <i>Extensibility in Tcl</i>, Dr. Dobb's Journal, 24(6), June 1999.</li></ul>
<ul><li>Robert S. Gray, <i>Agent Tcl: A flexible and secure mobile-agent system</i>, Dr. Dobbs Journal, 22(3):18-27, March 1997.</li></ul>
<ul><li>Peter Wayner, <i>Net Programming For The Masses</i>, BYTE, February 1996. <a rel="nofollow" class="external autonumber" href="http://www.byte.com/art/9602/sec11/art1.htm">[4]</a></li></ul>
<ul><li>Kathryn Edwards, <i>The A-Z of Programming Languages: Tcl</i>, Computerworld, May 2009. <a rel="nofollow" class="external autonumber" href="http://www.computerworld.com.au/article/301772/a-z_programming_languages_tcl">[5]</a></li></ul>
<ul><li>Salvatore Sanfilippo, <i>Tcl the Misunderstood</i>, March 2006 <a rel="nofollow" class="external autonumber" href="http://antirez.com/articoli/tclmisunderstood.html">[6]</a></li></ul>
<ul><li>Daniel Roche, <i>L'écriture d'interface graphique en Tcl/Tk</i>, GNU Linux Magazine France n°2, <time class="nowrap" datetime="1998-12" data-sort-value="1998-12">Décembre 1998</time>.</li></ul>
<ul><li>David Zolli, <i>Découvrez Tclkit, les starkits et les starpacks</i>, GNU Linux Magazine France n°60, <time class="nowrap" datetime="2004-04" data-sort-value="2004-04">avril 2004</time>, pp66-69.<a rel="nofollow" class="external autonumber" href="https://www.zolli.fr/fichiers/linuxmag60.pdf">[7]</a></li></ul>
<ul><li>Xavier Garreau, <i>Tcl Avancé</i>, GNU Linux Magazine France n°95, <time class="nowrap" datetime="2007-06" data-sort-value="2007-06">juin 2007</time>, pp82-91.</li></ul>
<ul><li>Gérard Sookahet, <i>Les nouveautés de Tcl/Tk 8.6</i>, GNU Linux Magazine France n°165, <time class="nowrap" datetime="2013-11" data-sort-value="2013-11">novembre 2013</time>, pp4-11 <a rel="nofollow" class="external autonumber" href="http://connect.ed-diamond.com/GNU-Linux-Magazine/GLMF-165/Les-nouveautes-de-Tcl-Tk-8.6">[8]</a>.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Annexes">Annexes</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Bibliographie">Bibliographie</h3></div>
<ul><li><abbr class="abbr indicateur-langue" title="Langue : français">(fr)</abbr> Bernard Desgraupes, <i>Tcl/Tk - Apprentissage et Référence, <abbr class="abbr" title="Deuxième">2<sup>e</sup></abbr>&nbsp;édition</i>, Vuibert, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">978-2-7117-4878-5</span>)</small>, 2009.</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> John K. Ousterhout, <i>Tcl and the Tk Toolkit</i>, Addison-Wesley, Reading, MA, USA, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">0-201-63337-X</span>)</small>, 1994. (Draft disponible en <a rel="nofollow" class="external text" href="https://web.archive.org/web/20050308222913/http://slwww.epfl.ch/SIC/SL/logiciels/TclTk/TclTk_tk3.6_doc.html">ligne</a>)</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Brent B. Welch, <i>Practical Programming in Tcl and Tk</i>, Prentice Hall, Upper Saddle River, NJ, USA, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">0-13-038560-3</span>)</small>, 2003. (Plusieurs chapitres en <a rel="nofollow" class="external text" href="http://www.beedub.com/book/">ligne</a>)</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> J. Adrian Zimmer, <i>Tcl/Tk for Programmers</i>, IEEE Computer Society, distribué par John Wiley and Sons, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">0-8186-8515-8</span>)</small>, 1998. (Plusieurs chapitres en <a rel="nofollow" class="external text" href="http://jazimmer.net/sbf/tcl/book/home.html">ligne</a>)</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Cliff Flynt, <i>Tcl/Tk for Real Programmers</i>, Morgan Kaufman Publishers, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">0-12-261205-1</span>)</small>, 1998.</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Eric Foster-Johnson, <i>Graphical applications with Tcl and Tk</i>, M&amp;T, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">1-55851-569-0</span>)</small>, 1997.</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Mark Harrison et Michael McLennan, <i>Effective Tcl/Tk Programming</i>, Addison-Wesley, Reading, MA, États-Unis, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">0-201-63474-0</span>)</small>, 1998.</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Mark Harrison (ed), <i>Tcl/Tk Tools</i>, O'Reilly Media, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">1-56592-218-2</span>)</small>, 1997.</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> David Maggiano, <i>CGI Programming with Tcl</i>, Addison Wesley, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">0-201-60629-1</span>)</small>, 2000.</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Raymond Blair, Arvind Durai et John Lautmann, <i>Tcl Scripting for Cisco IOS (Networking Technology)</i>, Cisco Press, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">1-58705-945-2</span>)</small>, 2010.</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Wojciech Kocjan et Piotr Beltowski, <i>Tcl 8.5 Network Programming</i>, <a href="Packt_Publishing" class="mw-redirect" title="Packt Publishing">Packt Publishing</a>, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">1-84951-096-2</span>)</small>, 2010.</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Ashok P. Nadkarni, <i>The Tcl Programming Language: A Comprehensive Guide</i>, CreateSpace Independent Publishing Platform , <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">1-54867-964-X</span>)</small>, 2017.</li>
<li><abbr class="abbr indicateur-langue" title="Langue : portugais">(pt)</abbr> Alexander Franca, <i>Tcl/Tk: Programação Linux</i>, Brasport, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">978-85-7452-221-0</span>)</small>, 2005.</li>
<li><abbr class="abbr indicateur-langue" title="Langue : tchèque">(cs)</abbr> Zdzislaw Wrzeszcz , <i>Tcl/Tk: Podrobný průvodce programátora</i>, Brasport, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">978-80-2510-781-2</span>)</small>, 2005.</li></ul>
<div class="mw-heading mw-heading3"><h3 id="Articles_connexes">Articles connexes</h3></div>
<ul><li><a href="Tk_(informatique)" title="Tk (informatique)">Tk</a>, extension graphique de Tcl.</li>
<li><a href="Langage_de_script" title="Langage de script">Langage de script</a></li></ul>
<div class="mw-heading mw-heading3"><h3 id="Liens_externes">Liens externes</h3></div>
<ul><li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.tcl.tk/">Site officiel</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://core.tcl.tk/">Site de développement</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : français">(fr)</abbr> <a rel="nofollow" class="external text" href="http://www.uppp.free.fr/Tcltk.htm">Tcl/Tk en bref</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : français">(fr)</abbr> <a rel="nofollow" class="external text" href="http://wfr.tcl.tk/fichiers/pub/Laprevote.pdf">Cours Tcl/Tk de Arnaud Laprevote</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://wiki.tcl.tk/">Wiki Tcl</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : français">(fr)</abbr> <a rel="nofollow" class="external text" href="http://wfr.tcl.tk/">Wiki Tcl</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.linbox.com/ucome.rvt?file=/any/doc_distrib/tcltk-8.3.2/index.html">Vaste documentation non officielle</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : français">(fr)</abbr> <a rel="nofollow" class="external text" href="http://www.tldp.org/pub/Linux/docs/HOWTO/translations/fr/pdf/TclTk-HOWTO.pdf">HOWTO Linux</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.tcl.tk/software/tcllib/">Tcllib</a> la bibliothèque standard de Tcl</li></ul>
<div class="navbox-container" style="clear:both;">

</div>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail des logiciels libres</span> </span></li> <li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de la programmation informatique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2025-01-31" href="https://fr.wikipedia.org/wiki/?title=Tool_Command_Language&amp;oldid=222566853">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>